2015-12-15 11 views
7

Der folgende Code führt zu undefinierten Element in der MitteJavascript undefinierten Elemente tritt während Regex aufgeteilt

"Hello World\n\nhello world".split(/\n(\n|\t|\s)*?\n/) 
"Hello World\n\nhello world".split(/\n(\n|\t|\s)*\n/) 

Der Ausgang ist

["Hello World", undefined, "hello world"] 

ich mit jedem, wenn es gab zwei neue Zeile Zeichen spalten wollte Anzahl der neuen Zeilen oder Leerzeichen oder Tabulatoren zwischen ihnen, solange sie keine Alphabete oder Symbole oder Zahlen sind.

+1

I Ich denke du willst '/ \ n \ s * \ n /' –

Antwort

7

Es weil ist, wenn Sie eine Capture-Gruppe in einem Split-Muster verwenden, Javascript, enthält den Inhalt der Capture-Gruppe im Ergebnis. Da die Capture-Gruppe nicht leer sein kann, wird sie nie wiederholt, deshalb erhalten Sie "undefined" und keine leere Zeichenfolge.

Um dies zu verhindern, eine Nicht-Erfassung Gruppe oder eine Zeichenklasse verwenden:

"Hello World\n\nhello world".split(/\n(?:\n|\t|\s)*\n/) 
"Hello World\n\nhello world".split(/\n\s*\n/) # (\t and \n are already included in \s) 

Hinweis: Wenn Sie zu führende und nachfolgende Leerzeichen entfernen möchten, können Sie:

/(?:[^\S\n]*\n){2}\s*/ 
+0

haha ​​.. ich verstehe warum ich es bekommen habe. –

4

Verwenden Sie eine non-capturing group, um zu verhindern, dass der Inhalt der Erfassungsgruppe (n) eingeschlossen wird.

/\n(?:\n|\t|\s)*?\n/ 

Es wird zurück:

"Hello World\n\nhello world".split(/\n(?:\n|\t|\s)*?\n/); 
// ["Hello World", "hello world"]