2016-08-28 2 views
0

Ich bin kein Experte in Regex und ich möchte nur diese Sache tun. Erstellen Sie dieses Array :Get-Array aller Zeichenfolgen zwischen zwei Zeichen (Regex + JavaScript)

["[1+5]", "1+5", "[2*[1+1]+5]", "2*[1+1]+5", "[1+1]", "1+1"] 

aus dieser Zeichenfolge:

"blalbla[1+5] blabla [2*[1+1]+5] blalbla" 

ich viele Methoden getestet haben, habe ich Kopfschmerzen ... Hier der Link zu testen, was ich hatte: https://jsfiddle.net/a47e60pd/1/

Vielen Dank :)

+0

Wenn Sie eine beliebige Ebene verschachtelter Klammern haben, können Sie keine Regex verwenden. JS regex unterstützt keine Rekursion. Oder Sie möchten ['XRegExp.matchRecursive'] (http://xregexp.com/api/#matchRecursive) verwenden. –

+0

Was ist der Sinn dieser Übung? Werden Sie diese bewerten, dh? "1 + 1" durch "2" ersetzen? – georg

+0

@ WiktorStribiżew Vielen Dank für die Informationen. – Saad

Antwort

2

Verwenden Sie keine Regex. Benutze einfach eine Schleife.

function* parse(str) { 
 
    var indices = []; 
 
    for(var i=0; i<str.length; ++i) { 
 
    if(str[i] === '[') { 
 
     indices.push(i); 
 
    } else if(str[i] === ']') { 
 
     let idx = indices.pop(); 
 
     yield str.slice(idx+1, i); 
 
     yield str.slice(idx, i+1); 
 
    } 
 
    } 
 
} 
 
console.log([...parse("blalbla[1+5] blabla [2*[1+1]+5] blalbla")]);

+0

Ehrfürchtig. Vielen Dank. Aufgelöst. – Saad

+0

Seien Sie vorsichtig http://caniuse.com/#search=function* – lordyoum

0

ist möglich mit sauberen Regex wie folgt aus:

/\[[^[]+\]|\[.+?\]([^[])+\]/g 

Erläuterung: Gruppe 1: \[[^[]+\] Klammern finden, die ohne weitere Klammern beginnen und enden.

Oder | Gruppe 2:

\[.+?\] den Beginn der Klammern finden, bis die Oberfläche Klammern und ([^[])+\] weiterhin alle Zeichen finden, die nicht "[" bis zum letzten "]"

var ExpToReturn; 
 

 
var text = "blalbla[1+5] blabla [2*[1+1]+5] blalbla"; 
 

 
var str = text.match(/\[[^[]+\]|\[.+?\]([^[])+\]/g); 
 

 
ExpToReturn = (str); 
 

 
alert (ExpToReturn);

+0

Ihre Methode ist auch gut. Aber ich bevorzuge Oriols Methode. Vielen Dank für Ihre nützliche Antwort – Saad

Verwandte Themen