3 回答

TA貢獻1797條經驗 獲得超6個贊
正如我所說的,流行的看法相反(不相信一切人說)匹配嵌套的括號內是可能的正則表達式。
使用它的不利之處在于,您最多只能將嵌套固定到一個水平。對于您希望支持的每個其他級別,您的正則表達式將越來越大。
但是不要相信我。我來給你展示。正則表達式:
\([^()]*\)
匹配一個級別。對于最多兩個級別,您需要:
\(([^()]*|\([^()]*\))*\)
等等。為了繼續添加級別,您所要做的就是將中間(第二個)[^()]*部分更改為([^()]*|\([^()]*\))*(在此處檢查三個級別)。正如我所說,它將越來越大。
你的問題:
對于您的情況,兩個級別可能就足夠了。因此,其Java代碼為:
String fortranCode = "code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.";
String regex = "(\\w+)(\\(([^()]*|\\([^()]*\\))*\\))"; // (\w+)(\(([^()]*|\([^()]*\))*\))
System.out.println(fortranCode.replaceAll(regex, "__$1%array$2"));
輸入:
code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.
輸出:
code code __u%array(i, j, k) code code code code __u%array(i, j, k(1)) code code code u(i, j, __k%array(m(2))) should match this last 'u', but it doesnt.
底線:
在一般情況下,解析器會做得更好-這就是人們對此大為惱火的原因。但是對于簡單的應用程序,正則表達式就足夠了。
注意:某些類型的正則表達式支持嵌套運算符R(Java不支持,而PHPE和Perl等PCRE引擎不支持),它允許您嵌套任意數量的級別。有了他們,您可以執行:\(([^()]|(?R))*\)。
添加回答
舉報