2011-05-04 39 views
5

我在Expresso中找到了一個正則表達式模板,這個工作正常並且返回完美匹配,但是在JavaScript中它不起作用。我知道它可能是爲了後視,但我沒有足夠的效率在正則表達式中使它與JS兼容。這個正則表達式如何與JavaScript兼容?

\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\) 

我想與它相匹配...

max(50, max(51, 60)) a() MAX(s,4,455)something 

......它應該返回......

1: (50, max(51, 60)) 

2:() 

3: (s,4,455) 

這工作完全在快報但JS控制檯在Chrome說:

Uncaught SyntaxError: Invalid regular expression: /\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\)/: Invalid group 

這個正則表達式怎麼樣被修改爲在JavaScript中正常運行?

回答

4

假設你定正則表達式是一個.NET regular expression,下面的語法組件不受JavaScript的支持:

要獲得通過JavaScript相同的結果,你需要做自己的平衡:

var parts = str.match(/[()]|[^()]+/g), 
    matches = [], 
    balance = 0; 
for (var i=0, j=0; i<parts.length; i++) { 
    switch (parts[i]) { 
    case "(": 
     if (balance === 0) { 
      j = i; 
     } 
     balance++; 
     break; 
    case ")": 
     if (balance === 1) { 
      matches.push(parts.slice(j, i+1).join("")); 
     } 
     balance--; 
     if (balance < 0) { 
      throw new EvalError('parentheses are not balanced; unexpected "("'); 
     } 
     break; 
    } 
} 
if (balance > 0) { 
    throw new EvalError('parentheses are not balanced; missing ")"'); 
} 
2

Javascript中沒有負面的後顧之憂。你必須找到一個替代方案。

編輯:我再次看着你的RegEx,我覺得我看到負面的後視,但我想我沒有。無論如何,我會留下這些信息用於提供信息。

+4

檢查此鏈接在JavaScript中看後面:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript – 2011-05-04 16:07:09

+0

而且還有你的選擇。謝謝,Rocket。 – 2011-05-04 16:08:00

6

JavaScript不支持named capture groups(?<number>)

正如this question建議,正則表達式可能不適合這份工作的合適工具。但是,如果你只是想匹配最外面的括號的組,你可以使用這個

/\([^)]*(\s?\))*\)/g 

看到它http://refiddle.com/114

+0

感謝保羅,它在給定的字符串中工作,但不會在不同的字符串中返回預期的結果。 AVG(ROUND(5,8),10,11)* MAX(MAX(5),10,AVG(5))任何建議? – Usman 2011-05-04 16:39:09

+0

是的,正則表達式並不能很好地處理嵌套。你可能會更好地編寫一個標記器並自己手動解析字符串,而不是使用正則表達式。 – 2011-05-04 16:48:32

+0

我明白了,再次感謝:) – Usman 2011-05-04 20:03:13

0

在JavaScript的工作,數字可以用[0-9]或\ d 不能定義一個數字是[^ 0-9]或\ d

相關問題