Usuń nie ciągi alfanumeryczne z ciągu


224

Chcę przekonwertować następujący ciąg na dostarczone dane wyjściowe.

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

Nie znalazłem żadnego rozwiązania, które będą obsługiwać znaki specjalne, takie jak \r, \n, \b, itd.

Zasadniczo chcę po prostu pozbyć się wszystkiego, co nie jest alfanumeryczne. Oto, co próbowałem ...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

Jeszcze jedna próba z wieloma krokami

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

z wynikami

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

Każda pomoc będzie mile widziana.

Rozwiązanie robocze:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"

Interesujące pytanie, \ n w \ new jest wyraźnie tym, co się potknie. Nie jestem do końca pewien, jak to znaleźć i zastąpić, choć idzie szukać wyrażenia regularnego na białych znakach specjalnych
Will Buck

1
Czy dane wejściowe są ucieczkowe / w jaki sposób są przypisywane? var Input = "\\test\red\bob\fred\new"ten ciąg nie zawiera „czerwonego”, więc Twoja pierwsza próba jest poprawna, czy testujesz w stosunku do śmieci "\\\\test\\red\\bob\\fred\\new"?
Alex K.,

/[^\w\s]+/giSpróbuj tego.
Bartosz Grzybowski,

Myślę, że pytanie brzmi, czy odwrotne ukośniki w ciągu wejściowym reprezentują znaki specjalne? (Na podstawie twojego przykładowego wyniku, zgaduję, że nie.)
Dave

Próbowałeś zmienić podwójne cudzysłowy na pojedyncze?
OptimusCrime

Odpowiedzi:


468

Usuwanie znaków niealfanumerycznych

Poniżej znajduje się / poprawne wyrażenie regularne do usuwania znaków niealfanumerycznych z ciągu wejściowego:

input.replace(/\W/g, '')

Zauważ, że \Wjest to odpowiednik [^0-9a-zA-Z_]- zawiera znak podkreślenia. Aby również usunąć podkreślenia, użyj np .:

input.replace(/[^0-9a-z]/gi, '')

Dane wejściowe są zniekształcone

Ponieważ łańcuch testowy zawiera różne znaki specjalne, które nie są alfanumeryczne, usunie je.

Ukośnik odwrotny w łańcuchu musi być poprzedzony znakiem ucieczki, jeśli ma być traktowany dosłownie:

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

Obsługa zniekształconych ciągów

Jeśli nie jesteś w stanie poprawnie uciec z łańcucha wejściowego (dlaczego nie?) Lub pochodzi z jakiegoś niezaufanego / źle skonfigurowanego źródła - możesz zrobić coś takiego:

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

Zauważ, że reprezentacja json ciągu zawiera cytaty:

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

Ale są one również usuwane przez regex zastępczy.


10
To nie usuwa podkreślników.
kylex

4
@kylex, to dlatego, że podkreślenia są uważane za część grupy alfanumerycznej, z jakiegoś powodu
Eugene Kuzmenko

12
„Ponieważ są to znaki zwykle zgodne z identyfikatorami zmiennych.” . W pytaniu nie ma „_”, oczywiście zastąpienie \Wgo [_\W](które jest używane w pytaniu) lub podobnym spowoduje usunięcie podkreślenia.
AD7six

1
@ AD7six, czy mógłbyś wyjaśnić, dlaczego należy używać JSON.stringify (), gdy ciąg znaków pochodzi z niezaufanego źródła? Czy istnieje obawa dotycząca bezpieczeństwa, aby tego nie robić? Dzięki!
jbmusso

1
@ guithor To nie jest tak, że „należy” lub że w ogóle wpływa to na bezpieczeństwo; Jeśli odbierany jest „jakiś ciąg” i z jakiegokolwiek powodu jest on zasadniczo przerywany (nie wynika z pytania, dlaczego ciąg jest zniekształcony) - pozwala zobaczyć ciąg takim, jakim jest: jsfiddle.net/Z6N7C
AD7six

49

Wszystkie obecne odpowiedzi wciąż mają dziwactwa, najlepszą rzeczą, jaką mogłem wymyślić, to:

string.replace(/[^A-Za-z0-9]/g, '');

Oto przykład, który rejestruje każdy klawisz, który mogłem znaleźć na klawiaturze:

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

Wyjścia: „123abcABC”


1
input.replace(/\W/g, '')pozostawia w ciągu _. @ Dememetix ma rację string.replace(/[^A-Za-z0-9]/g, '');działa lepiej, ponieważ usuwa wszystkie znaki niealfanumeryczne z ciągu.
Tim

1
A jednak żadna kombinacja tej odpowiedzi nie odpowiada na zadane pytanie .
AD7six

10

Problem nie polega na tym, jak zamieniasz znaki, problem polega na tym, jak wpisujesz ciąg.

To dopiero pierwszy ukośnik w wejściu, że to znak backslash, inni są częścią znaków sterujących \r, \b, \fi \n.

Ponieważ te ukośniki odwrotne nie są oddzielnymi znakami, ale stanowią część zapisu pojedynczych znaków kontrolnych, nie można ich usunąć osobno. Oznacza to, że nie można usunąć ukośnika odwrotnego, \nponieważ nie są to dwa oddzielne znaki, to sposób pisania znaku kontrolnego LFlub przejścia do nowego wiersza .

Jeśli chcesz zmienić to wejście w pożądany wynik, musisz zastąpić każdy znak kontrolny odpowiednią literą, np. Zastąpić znak \nznakiem n.

Aby zastąpić znak kontrolny, musisz użyć zestawu znaków podobnego do [\r], który \rma specjalne znaczenie w wyrażeniu regularnym:

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

Demo: http://jsfiddle.net/SAp4W/


Rozumiem wszystko, co mówisz, ale pytanie wciąż pozostaje aktualne i nikt nie zasugerował jeszcze poprawnej odpowiedzi. Dane wejściowe mogą być zmianami, ale nikt nie sugeruje odpowiedzi, jak programowo zmienić je w JS.
Bobby Cannon

2
@BobbyCannon: Dodałem kod, który pobiera dokładne dane wejściowe i generuje pożądane dane wyjściowe.
Guffa,

5

możesz spróbować tego wyrażenia regularnego:

value.replace(/[\W_-]/g, '');

na pytanie: Chcę się tylko pozbyć wszystkiego, co nie jest alfanumeryczne. jakiej produkcji oczekiwałeś?
myrcutio

0

Usuwa to wszystkie znaki niealfanumeryczne, zachowuje wielkie litery i spacje między słowami.

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123

To nie działa (proszę przeczytać pytanie) - To także dość skomplikowany sposób robienia rzeczy.
AD7six,

1
@ AD7six dziękuję za zwrócenie uwagi na mój błąd. Po skopiowaniu wkleiłem dane wejściowe do WebStrom, automatycznie dodałem 2 dodatkowe ukośniki odwrotne do każdego istniejącego ukośnika odwrotnego. Nie zauważyłem tego. input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new".
Flavio

-1

Oto przykład, którego możesz użyć,

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");

-3

Jeśli chcesz mieć ten \\test\red\bob\fred\newciąg, powinieneś uciec od wszystkich odwrotnych ukośników ( \). Kiedy piszesz, \\test\\red\\bob\\fred\\newtwój ciąg faktycznie zawiera pojedyncze ukośniki odwrotne. Możesz być pewien, że wydrukujesz swój ciąg.
Jeśli więc odwrócone ukośniki w łańcuchu zostaną usunięte, myString.replace(/\W/g,'')będzie działać normalnie.


1
Jeśli chcesz zasugerować „powinieneś uciec od wszystkich ukośników odwrotnych ()”, musisz podać przykład, jak to zrobić.
Bobby Cannon

Czym są podwójne ukośniki ??? a co mam na myśli mówiąc: „Kiedy piszesz \\ test \\ czerwony \\ bob \\ fred \\ nowy, twój ciąg zawiera pojedyncze ukośniki odwrotne.” ??? Czy to nie wyjaśnia?
shift66

Dane wejściowe to „\\ test \ red \ bod \ fred \ new” i nie można ich zmienić. Potrzebuję rozwiązania dla tego ciągu wejściowego. Jeśli chcesz mi pokazać, jak „wykasować ukośniki odwrotne”, podaj przykład. Nie możemy zmienić danych wejściowych. Zobacz zaakceptowaną odpowiedź. Rozwiązanie pozwoliło, aby dane wejściowe nie uległy zmianie, ale dały pożądany wynik.
Bobby Cannon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.