2016-10-27 4 views
2

Ich habe Regexp, die Werte zwischen Klammern extrahiert.Regexp, zwischen Klammern gefangen, Javascript

Es ist die meiste Zeit arbeiten, aber nicht, wenn es endet mit einem Klammern

var val = 'STR("ABC(t)")'; 
var regExp = /\(([^)]+)\)/;. 
var matches = regExp.exec(val); 
    ​ 
console.log(matches[1]); //"ABC(t" 

Was ich will, ist "ABC(t)".

Irgendwelche Ideen, wie ich meine regexp dies achive ändern können?

Aktualisieren Der Wert steht immer innerhalb der Klammern.

Einige Beispiele:

'ASD("123")'; => '123' 
'ASD(123)'; => '123' 
'ASD(aa(10)asda(459))'; => 'aa(10)asda(459)' 

Also zunächst ist es ein Text (immer Text). Dann gibt es ein (und es endet immer mit a). Ich möchte den Wert zwischen.

+0

Sie die falsche Schließung entgangen) '', so dass Ihre Erfassungsgruppe endet und dann die Sie passen ') '(wenn es andersherum sein sollte). Abstimmung außerhalb des Themas, weil das Problem ein typografischer Fehler ist. – Quentin

+0

Wenn es keine speziellen Einschränkungen für die Eingabe gibt, ist dies mit einem Regex ziemlich schwer zu lösen. Abhängig davon, was in der Eingabe zulässig ist und was nicht, kann nur ein tatsächlicher Parser dies korrekt tun. – deceze

+1

was in diesem Fall übereinstimmen soll ''irgendein Text (num (10a) ss) STR (" ABC (t) ")''? – RomanPerekhrest

Antwort

2

Sie können die gierige Punktanpassung innerhalb des Gruppe-1-Musters verwenden: /\((.+)\)/. Es wird die erste (, dann alle 1+ Zeichen außer Zeilenumbrüche Symbole und dann die letzte ) in der Zeile übereinstimmen.

var vals = ['STR("ABC(t)")', 'ASD("123")', 'ASD(123)', 'ASD(aa(10)asda(459))']; 
 
var regExp = /\((.+)\)/; 
 
for (var val of vals) { 
 
    var matches = regExp.exec(val); 
 
    console.log(val, "=>", matches[1]); 
 
}

Kommentar Answering: Wenn die Texte nach innen extrahieren müssen ausgeglichen Klammern verschachtelt werden, entweder einen kleinen Parsing-Code oder XRegExp#matchRecursive kann helfen. Da es auf SO um viele Parsing-Codes sind, stelle ich XRegExp Beispiel:

var str = 'some text (num(10a) ss) STR("ABC(t)")'; 
 
var res = XRegExp.matchRecursive(str, '\\(', '\\)', 'g'); 
 
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/2.0.0/xregexp-all-min.js"></script>

+0

Sie sollten' ein wenig Text (num (10a) ss) STR ("ABC (t)") 'im Testdatensatz;) :) – GreenAsJade

+0

@GreenAsJade: Nein, OP hat keine solchen Texte, ich kann aber auch eine Lösung für diese Zeichenfolge hinzufügen. –

+0

Ich habe nur in Kommentaren über die Frage Witze gemacht.Die Frage in den Kommentaren soll verdeutlichen, ob die Regex übereinstimmende Parens analysieren soll, was meiner Meinung nach nicht der Fall ist. – GreenAsJade