Ich habe diesen Code:
var r = /(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*){0,}$/
var s = " a , b , c "
var m = s.match(r)
m => [" a , b , c ", "a", "c"]
Sieht so aus, als ob die gesamte Zeichenfolge abgeglichen wurde, aber wohin ist sie "b"
gegangen? Ich würde eher erwarten zu bekommen:
[" a , b , c ", "a", "b", "c"]
damit kann ich m.shift()
mit einem ergebnis wie s.split(',')
aber auch mit entfernten Leerzeichen fertig werden.
Habe ich einen Fehler im regulären Ausdruck oder verstehe ich ihn falsch String.prototype.match
?
javascript
regex
meandre
quelle
quelle
{0,}
ist das gleiche wie*
.s
kann auch sein' a, c'
oder'a,b,c d e, f'
Antworten:
Hier ist eine ziemlich einfache und unkomplizierte Möglichkeit, dies zu tun, ohne einen komplexen regulären Ausdruck zu benötigen.
var str = " a , b , c " var arr = str.split(",").map(function(item) { return item.trim(); }); //arr = ["a", "b", "c"]
Der native
.map
wird ab IE9 unterstützt: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapOder in ES6 + wird es noch kürzer:
var arr = str.split(",").map(item => item.trim());
Und zur Vervollständigung hier in Typescript mit Tippinformationen
var arr: string[] = str.split(",").map((item: string) => item.trim());
quelle
var arr = str.split(",").map(item=>item.trim());
Sie können dies ohne komplexe reguläre Ausdrücke versuchen.
var arr = " a , b , c ".trim().split(/\s*,\s*/); console.log(arr);
quelle
Kurze Antwort: Verwenden
m = s.match(/[^ ,]/g);
Ihr RE funktioniert nicht wie erwartet, da die letzte Gruppe mit der letzten Übereinstimmung übereinstimmt (=
c
). Wenn Sie dies weglassen{1,}$
, wird die zurückgegebene Übereinstimmung angezeigt" a , b ", "a", "b"
. Kurz gesagt, Ihr RegExp gibt so viele Übereinstimmungen wie angegebene Gruppen zurück, es sei denn, Sie verwenden einglobal
Flag/g
. In diesem Fall enthält die zurückgegebene Liste Verweise auf alle übereinstimmenden Teilzeichenfolgen.Verwenden Sie:
m = s.replace(/\s*(,|^|$)\s*/g, "$1");
Dieses Ersetzen ersetzt jedes Komma (
,
), Anfang (^
) und Ende ($
), umgeben von Leerzeichen, durch das ursprüngliche Zeichen (comma
oder nichts).Wenn Sie ein Array erhalten möchten, verwenden Sie:
m = s.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/);
Dieser RE schneidet die Zeichenfolge ab (entfernt alle Leerzeichen am Anfang und Ende und teilt die Zeichenfolge dann durch
<any whitespace>,<any whitespace>
. Beachten Sie, dass Leerzeichen auch Zeilenumbrüche und Tabulatoren enthalten. Wenn Sie nur Leerzeichen verwenden möchten, verwenden Siestattdessen ein Leerzeichen ( )
\s
.quelle
split
Methode.s.match(/[^ ,]+/g)
. Wie oben in meiner Antwort erwähnt,/g
ist das das globale Flag, das alle übereinstimmenden Teilzeichenfolgen zurückgibt.a
,b
undc
brauchen Sie drei Paare von Klammern (ohne(?:...)
):/(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)$/
ES6-Kurzform:
str.split(',').map(item=>item.trim())
quelle
Sie können dies für Ihren Zweck tun.
BEARBEITEN : Entfernen der zweiten Ersetzung, wie in den Kommentaren vorgeschlagen.
s.replace(/^\s*|\s*$/g,'').split(/\s*,\s*/)
Zuerst wird
replace
die Zeichenfolge abgeschnitten und dann wird diesplit
Funktion aufgeteilt'\s*,\s*'
. Dies gibt Ausgabe["a", "b", "c"]
bei Eingabe" a , b , c "
Warum Ihr regulärer Ausdruck "b" nicht erfasst, wiederholen Sie eine erfasste Gruppe, sodass nur das letzte Vorkommen erfasst wird. Mehr dazu hier http://www.regular-expressions.info/captureall.html
quelle
Also ging ich schließlich mit
/(?=\S)[^,]+?(?=\s*(,|$))/g
, was genau das bietet, was ich brauche: alle durch ',' geteilten Sätze ohne umgebende Leerzeichen.' a, OMG abc b a b, d o WTF foo '. match( /(?=\S)[^,]+?(?=\s*(,|$))/g ) => ["a", "OMG abc b a b", "d o WTF foo"]
Danke vielmals!
quelle
(?=\S)
- Beginnen Sie mit der Erfassung nur, wenn kein Leerzeichen vor Ihnen steht.[^,]+
Erfassen Sie so viele Nicht-Kommas wie möglich.?
Erfassen Sie jedoch nicht, was von der nächsten Gruppe erfasst werden kann.(?=\s*(,|$))
Erfassen Sie alle Leerzeichen zuvor ein Komma oder Ende der Zeichenfolge/g
- wiederholen Sie die gesamte ZeichenfolgeWenn Sie weiterhin reguläre Ausdrücke verwenden möchten, halten Sie den Code einfach und ohne Verwendung von ES6:
s.replace(/ /g, '').split(",")
1 - Ersetzen Sie alle Leerzeichen (/ / g) durch leere Zeichenfolgen ('')
2 - Teilen Sie es dann in ein Array auf
Et voila
quelle