2016-08-05 5 views
1

Ich möchte meine Eingabe überprüfen, wenn sie Ziffern enthält, die durch Leerzeichen getrennt sind. Ich habe versucht die RegexDie ganze Zeichenfolge validieren und alle Übereinstimmungen erhalten

^(\d)(?:\s(\d))*$ 

und konnte die Gültigkeit über die test(String) Methode überprüfen, aber wenn ich str.split(regex) verwenden Sie es nicht geben Sie mir die richtigen Begegnungen.

Zum Beispiel, ich habe Eingang

2 3 4 5 

Wenn ich versuche, die split Methode zu verwenden, ich

["", "2", "5", ""] 

bekommen Ich war das Ergebnis erwartet

["2", "3", "4", "5"] 

Beliebig zu sein Vorschlag wird sehr geschätzt, danke!

+1

Mit einem Leerzeichen teilen. Warum möchten Sie denselben Validierungsregex verwenden, um separate Ziffern zu erhalten? Bitte klären Sie. BTW, '[" "," 2 "," 5 "," "]' ist die korrekte Ausgabe für Ihre Regex-Teilung. –

+0

Um Ziffern zu erhalten, verwenden Sie einfach '\ d +' mit 'match()'; – Tushar

+0

Kannst du die Zeichenfolge nicht durch Leerzeichen teilen, oder welche Regeln sollten auch gelten? – webdeb

Antwort

2

Ihre ^(\d)(?:\s(\d))*$ regex teilt die Zeichenfolge richtig als ["", "2", "5", ""] weil:

  • Die erste (\d) eine Ziffer zu Beginn der Zeichenfolge erfasst und es in das resultierende Array einfügt. Da die Ziffer am Anfang gefunden wird, erscheint die leere Zeichenfolge vor dem Zeichenfolgenstart und die erste Ziffer als erstes Arrayelement, und 2 ist die zweite
  • Das (?:\s(\d))* Konstrukt ist eine * -quantitified nicht einfangende Gruppe, die 0 entspricht + sequences of whitespace gefolgt von einer Ziffer, und die Ziffer ist erfasst. Das heißt, jedes Mal, wenn eine Leerstelle + Ziffer übereinstimmt, wird der Gruppe-2-Slot mit einem neuen Wert neu geschrieben, und der letzte wird auf diese Weise beibehalten, nämlich 5. Da der rechte Teil des Rahmens am Ende des Strings liegt, wird der leere String zum resultierenden Array hinzugefügt.

Wenn die Zeichenfolge bereits bestätigt ist, müssen Sie nicht /\d+/g, können Sie nur mit einem Raum geteilt (beachten Sie, dass die Erfassung Gruppen in Ihrem regulären Ausdruck redundant sind dann):

var s = "2 3 4 5"; 
 
if (/^\d(?:\s\d)*$/.test(s)) { 
 
    console.log(s.split(" ")); 
 
} 
 
// var s = "2 3 4 a"; won't show any output

1

Verwenden Sie den regulären Ausdruck \d+ mit der globalen Option g (die .match sagt zurückzukehren alles nur die erste statt matches):

"2 3 4 5".match(/\d+/g)

Ergebnis: ["2", "3", "4", "5"]


Edit: Um die Gültigkeit der Eingabezeichenfolge (Anforderung: durch Leerzeichen getrennte Ziffern) zu testen, verwenden Sie:

(/^(\d)+\d?$/).test("1 2 3 4 a")

Die (\d)+ ein beliebige Anzahl von Wiederholungen einer Ziffer gefolgt von einem Leerzeichen und \d? entsprechen eine mögliche Hinter Ziffer ohne folgende Leerzeichen.

+0

Danke, aber wie kann ich die Eingabe validieren, wenn ich sagen soll, ich gebe '2 3 4 a' ein? Die "test" -Methode gibt mit dieser Eingabe "true" zurück – charmeleon

+1

Verwenden Sie einen separaten '.test', um die Eingabezeichenfolge zu validieren. –

+0

Ich habe die Antwort bearbeitet, um die Eingabeüberprüfung einzuschließen. –

Verwandte Themen