2016-09-27 9 views
4

Ich habe string:JavaScript Regex alle Zahlen bekommen, aber ausschließen alle Klammern

123 df456 555 [ 789 ] [abc 1011 def ] [ ghi 1213] [jkl mno 1415 pqr] 161718 jkl 1920

Ich brauche nur Zahlen zu erhalten, die zwischen square brackets [ ] nicht in Verkehr gebracht. Alle führten Zahlen muss ich innerhalb square brackets [ ] Das richtige Ergebnis sollte platzieren:

[123] df456 [555] [ 789 ] [abc 1011 def ] [ ghi 1213] [jkl mno 1415 pqr] [161718] jkl [1920]

Ich habe versucht, solche JavaScript Regex zu schreiben: /(?!\[(.*?)\])((\s|^)(\d+?)(\s|$))/ig

aber es scheint falsch zu sein, Es scheint, als ob positives Lookahead mehr Priorität hat als negative Lookahead.

+0

SORRY, aber auch alle die Zahlen aus einem Ergebnis muss ich in eckigen Klammern setzen. Das Endergebnis sollte sein: [1234] [blabla 101112] [67890] [113141516] bla171819 [212123] –

Antwort

2

Unter der Annahme, eckigen Klammern sind ausgewogen und un-verschachtelt, können Sie auch eine negative Look-Ahead-Nummern zu greifen außerhalb [...] verwenden können:

var str = '1232 [dfgdfgsdf 45] 1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123'; 
 
var re = /\b\d+\b(?![^[]*\])/g; 
 

 
var repl = str.replace(re, "[$&]"); 
 

 
console.log(repl); 
 
//=> [1232] [dfgdfgsdf 45] [1234] [ blabla 101112 ] [67890] [113141516 ] bla171819 [212123]

Diese Regex jede Zahl, die nicht ] hat voraus ohne übereinstimmung [.

RegEx Breakup:

\b    # word boundary 
\d+   # match 1 or more digits 
\b    # word boundary 
(?!   # negative lookahead start 
    [^[]*  # match 0 or more of any character that is not literal "[" 
    \]   # match literal ] 
)    # lookahead end 

RegEx Demo

+1

Dieser Fall (nicht von Frage, aber in meiner Arbeit) funktioniert nicht (Nummer verschachtelt zu)): str5 = "1232 [dfgdfgsdf 45]"; str5.replace (/ \ b \ d + \ b (?! [^] [] * \])/G, "[$ 1]"); –

+0

Ah, das ist richtig, es war eine kleine Optimierung erforderlich. Überprüfen Sie meine aktualisierte Antwort jetzt mit einer Regex-Demo. – anubhava

+1

Es funktioniert in allen Fällen! Perfekt! –

1

Spiel alle Teil zwischen [ und ] und Spiel und erfassen jene anderen, die ganze Wörter sind (im Wortgrenzen):

/\[[^\][]*\]|\b(\d+)\b/g 

Siehe regex demo und eine Demo-Code unten.

Einzelheiten:

  • \[[^\][]*\] - [, dann 0+ Zeichen andere als [ und ] und ein ]
  • | - oder
  • \b - führende Wortgrenze
  • (\d+) - Gruppe 1 erfasst eine oder mehrere Ziffern
  • \b - Hinterwortgrenze
  • /g - global, werden mehrere Vorkommen erwartet

var regex = /\[[^\][]*\]|\b(\d+)\b/ig; 
 
var str = '1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123'; 
 
var res = []; 
 
while ((m = regex.exec(str)) !== null) { 
 
    if (m[1]) res.push(m[1]); 
 
} 
 
console.log(res);

1

ich versuchen würde, und die eckigen Klammer-separierte Teil entfernen und dann ein tun passt für alle begrenzten Ziffernfolgen ... etwas wie dieses:

var string = '1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123'; 

string.replace(/\[.+?\]/g, '').match(/\b\d+\b/g); 
    // => ["1234", "67890", "212123"] 
+0

Der Unterschied hier ist, dass die '/\[.+?\]/ g 'dort nicht übereinstimmen sind Linebreak-Symbole zwischen '[' und ']'. Deshalb bleibe ich bei negierten Charakterklassen. –

+0

Das stimmt, in diesem Fall würde ich "/\[.+?\]/ g" durch "/ \ [[\ s \ S] +? \]/G" ersetzen. – James

1

Mai werden Sie tun können wie folgt;

var str = "1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123", 
 
result = str.match(/\d+(?=\s*\[|$)/g); 
 
console.log(result);

\d+(?=\s*\[|$) 

Regular expression visualization

Debuggex Demo

+0

Es funktioniert! Auch ich modifiziert, um [] zu "nackten" Zahlen hinzuzufügen: str4 = "1234 [blabla 101112] 67890 [113141516] bla171819 212123"; str4.replace (/ (\ d +) (? = \ S * \ [| $)/g, "[$ 1]"); Und es scheint, das Problem ist vollständig gelöst! Aber ich verstehe dein Muster nicht :) –

+0

@Sam Aniston Das Muster verwendet einen Blick nach vorn '(? =)'. Es sieht voraus für ein '\ s *' (0 oder mehr weiße Räume), gefolgt von einem '\ [' (rechte eckige Klammer) oder '|' für ein Ende der Linie '$' -> '(? = \ S * \ [| $) 'und sammelt alle Dezimalstellen' \ d + 'global vor ihnen. Ich bin froh, dass du dein Problem gelöst hast. – Redu

+0

Dies ist fehlerhaft und bricht ab, wenn die Eingabe '1234 ist bla171819 [blabla 101112] 67890 [113141516] bla171819 212123' – anubhava

Verwandte Themen