Entfernen Sie nicht alphanumerische Zeichen aus der Zeichenfolge

224

Ich möchte die folgende Zeichenfolge in die bereitgestellte Ausgabe konvertieren.

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

Ich habe festgestellt , keine Lösung , die Sonderzeichen behandelt wie \r, \n, \busw.

Grundsätzlich möchte ich nur alles loswerden, was nicht alphanumerisch ist. Folgendes habe ich versucht ...

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"

Ein weiterer Versuch mit mehreren Schritten

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]/ , "");
}

mit Ergebnissen

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

Jede Hilfe wäre dankbar.

Arbeitslösung:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"
Bobby Cannon
quelle
Interessante Frage, das \ n in \ new ist eindeutig, was dies auslöst. Ich bin nicht ganz sicher, wie ich das finden und ersetzen soll, obwohl ich nach Regex auf Whitespate-Sonderzeichen suche
Will Buck,
1
Werden die Eingaben maskiert / wie werden sie zugewiesen? var Input = "\\test\red\bob\fred\new"Diese Zeichenfolge enthält kein "Rot". Ihr erster Versuch ist also korrekt. Testen Sie gegen den Wurf "\\\\test\\red\\bob\\fred\\new"?
Alex K.
/[^\w\s]+/giVersuche dies.
Bartosz Grzybowski
Ich denke, die Frage ist, ob Backslashes in Ihrer Eingabezeichenfolge Sonderzeichen darstellen. (Basierend auf Ihrer Beispielausgabe, ich vermute nein.)
Dave
Sie haben versucht, von doppelten zu einfachen Anführungszeichen zu wechseln?
OptimusCrime

Antworten:

468

Nicht alphanumerische Zeichen entfernen

Das Folgende ist der / ein korrekter regulärer Ausdruck, um nicht alphanumerische Zeichen aus einer Eingabezeichenfolge zu entfernen:

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

Beachten Sie, dass dies \Wdem Äquivalent von [^0-9a-zA-Z_]- entspricht und den Unterstrich enthält. Um auch Unterstriche zu entfernen, verwenden Sie zB:

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

Die Eingabe ist fehlerhaft

Da die Testzeichenfolge verschiedene maskierte Zeichen enthält, die nicht alphanumerisch sind, werden sie entfernt.

Ein Backslash in der Zeichenfolge muss maskiert werden, wenn er wörtlich genommen werden soll:

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

Umgang mit fehlerhaften Saiten

Wenn Sie der Eingabezeichenfolge nicht korrekt entkommen können (warum nicht?) Oder wenn sie von einer nicht vertrauenswürdigen / falsch konfigurierten Quelle stammt, können Sie Folgendes tun:

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

Beachten Sie, dass die JSON-Darstellung einer Zeichenfolge die Anführungszeichen enthält:

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

Sie werden aber auch durch den Ersatz-Regex entfernt.

AD7six
quelle
10
Dadurch werden keine Unterstriche entfernt.
Kylex
4
@kylex, das liegt daran, dass Unterstriche aus irgendeinem Grund als Teil der alphanumerischen Gruppe angesehen werden
Eugene Kuzmenko
12
"Weil es sich um die Zeichen handelt, die in Variablenbezeichnern normalerweise zulässig sind." . Es gibt kein "_" in der Frage, natürlich würde das Ersetzen \Wdurch [_\W](was in der Frage verwendet wird) oder ähnliches Unterstriche entfernen.
AD7six
1
@ AD7six, können Sie bitte erläutern, warum JSON.stringify () verwendet werden sollte, wenn der String aus einer nicht vertrauenswürdigen Quelle stammt? Gibt es Sicherheitsbedenken, dies nicht zu tun? Vielen Dank!
jbmusso
1
@guithor Es ist nicht so, dass "man sollte" oder dass es die Sicherheit überhaupt beeinträchtigt; Wenn "eine Zeichenfolge" empfangen wird und aus irgendeinem Grund im Grunde genommen falsch ist (aus der Frage, warum die Zeichenfolge fehlerhaft empfangen wird, nicht ersichtlich), kann die Zeichenfolge so angezeigt werden,
AD7six
49

Alle aktuellen Antworten haben immer noch Macken. Das Beste, was ich mir einfallen lassen konnte, war:

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

Hier ist ein Beispiel, das jede Taste erfasst, die ich auf der Tastatur finden konnte:

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

Ausgaben: '123abcABC'

Deminetix
quelle
1
input.replace(/\W/g, '')Blätter in der _in einem String. @Deminetix string.replace(/[^A-Za-z0-9]/g, '');funktioniert besser, da alle nicht alphanumerischen Zeichen aus dem String entfernt werden.
Tim
1
Und doch beantwortet keine Permutation dieser Antwort tatsächlich die gestellte Frage .
AD7six
10

Das Problem liegt nicht darin, wie Sie die Zeichen ersetzen, sondern darin, wie Sie die Zeichenfolge eingeben.

Es ist nur der erste Backslash im Eingang, der ein umgekehrter Schrägstrich ist, sind die anderen Teil der Steuerzeichen \r, \b, \fund \n.

Da diese Backslashes keine separaten Zeichen sind, sondern Teil der Notation zum Schreiben einzelner Steuerzeichen, können sie nicht separat entfernt werden. Das heißt, Sie können den Backslash nicht entfernen, \nda es sich nicht um zwei separate Zeichen handelt. Auf diese Weise schreiben Sie das Steuerzeichen LFoder den Zeilenvorschub .

Wenn Sie diese Eingabe tatsächlich in die gewünschte Ausgabe umwandeln möchten, müssen Sie jedes Steuerzeichen durch den entsprechenden Buchstaben ersetzen, z. B. das Zeichen \ndurch das Zeichen ersetzen n.

So ersetzen Sie ein Steuerzeichen müssen einen Zeichensatz wie verwenden [\r], als \reine besondere Bedeutung in einem regulären Ausdruck hat:

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/

Guffa
quelle
Ich verstehe alles, was Sie sagen, aber die Frage bleibt bestehen und noch hat niemand die richtige Antwort vorgeschlagen. Die Eingabe kann geändert werden, aber niemand hat eine Antwort vorgeschlagen, wie sie programmgesteuert in JS geändert werden kann.
Bobby Cannon
2
@ BobbyCannon: Ich habe Code hinzugefügt, der Ihre genaue Eingabe übernimmt und die gewünschte Ausgabe erzeugt.
Guffa
5

Sie können diesen regulären Ausdruck ausprobieren:

value.replace(/[\W_-]/g, '');
Myrcutio
quelle
per die Frage: Ich möchte nur alles loswerden, was nicht alphanumerisch ist. Welchen Output haben Sie erwartet?
Myrcutio
0

Dadurch werden alle nicht alphanumerischen Zeichen entfernt, die Groß- und Kleinschreibung beibehalten und Leerzeichen zwischen Wörtern beibehalten.

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
Flavio
quelle
Das funktioniert nicht (bitte lesen Sie die Frage) - Es ist auch eine ziemlich komplexe Art, Dinge zu tun.
AD7six
1
@ AD7six danke für den Hinweis auf meinen Fehler. Wenn ich die Eingabe in WebStrom kopiere, werden automatisch 2 zusätzliche Backslashes zu jedem vorhandenen Backslash hinzugefügt. Ich habe es nicht bemerkt. input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new".
Flavio
-1

Hier ist ein Beispiel, das Sie verwenden können:

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

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");
Ravi Kishore
quelle
-3

Wenn Sie diese \\test\red\bob\fred\newZeichenfolge haben möchten , sollten Sie alle Backslashes ( \) maskieren . Wenn Sie schreiben, \\test\\red\\bob\\fred\\newenthält Ihre Zeichenfolge tatsächlich einzelne Backslashes. Sie können sicher sein, dass Sie Ihre Zeichenfolge drucken.
Wenn also Backslashes in Ihrer Zeichenfolge maskiert myString.replace(/\W/g,'')werden, funktioniert dies normal.

shift66
quelle
1
Wenn Sie vorschlagen möchten, "Sie sollten alle Backslashes () umgehen", müssen Sie ein Beispiel dafür bereitstellen.
Bobby Cannon
Was denkst du, sind doppelte Backslashes? und was ich damit meine zu sagen "Wenn Sie \\ test \\ red \\ bob \\ fred \\ new schreiben, enthält Ihre Zeichenfolge tatsächlich einzelne Backslashes." ??? Erklärt das nicht?
Shift66
Die Eingabe lautet "\\ test \ red \ bod \ fred \ new" und kann nicht geändert werden. Ich brauche eine Lösung für diese Eingabezeichenfolge. Wenn Sie mir zeigen möchten, wie man "die Backslashes entfernt", geben Sie ein Beispiel. Wir können die Eingabe nicht ändern. Siehe die akzeptierte Antwort. Die Lösung erlaubte, dass sich die Eingabe nicht änderte, sondern die gewünschte Ausgabe ergab.
Bobby Cannon