2016-10-27 365 views
2

我有正則表達式提取圓括號之間的值。正則表達式,括號之間的捕獲,javascript

它的工作大部分時間,但是當它與一個括號結束不

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

我要的是"ABC(t)".

任何想法如何,我可以修改我的正則表達式來實現這一目標?

更新 該值總是在括號內。

一些例子:

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

因此,首先有一些文字(文字總是)。然後是(而且總是以a結尾)。我想要之間的價值。

+0

你躲過了錯誤的收盤')',所以你捕獲組結束,那麼你匹配') '(當它應該是相反的方式)。由於問題是印刷錯誤,因此投票偏離主題。 – Quentin

+0

除非對輸入有特定的限制,否則用正則表達式解決這個問題相當困難。根據輸入中允許的內容以及哪些不允許,只有實際的解析器才能正確執行此操作。 – deceze

+1

在這種情況下應該匹配什麼''一些文本(num(10a)ss)STR(「ABC(t)」)? – RomanPerekhrest

回答

2

您可以在組1模式內使用貪婪點匹配:/\((.+)\)/。它將匹配第一個(,然後是除linebreak符號之外的任何1+個字符,然後是該行中的最後一個)

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]); 
 
}

回答評論:如果文本提取必須內嵌套的括號,或者一個小的解析代碼,或XRegExp#matchRecursive可以提供幫助。由於有大量的解析代碼周圍的話,我會提供XRegExp例如:

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

你應該包含'some text(num(10a )ss)測試數據集中的STR(「ABC(t)」)';):)​​ – GreenAsJade

+0

@GreenAsJade:不,OP沒有這樣的文本,無論如何,我也可以爲這個字符串添加一個解決方案。 –

+0

我只是在評論中開玩笑說這個問題。評論中的問題旨在說明正則表達式是否旨在解析匹配的parens,我相信它不是。 – GreenAsJade

相關問題