亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Java中將括號內的字符串(嵌套)匹配?

如何在Java中將括號內的字符串(嵌套)匹配?

qq_笑_17 2019-12-04 13:05:53
我想在括號內匹配一個字符串,例如:(i, j, k(1))^^^^^^^^^^^^該字符串也可以包含封閉的括號。如何在Java中將其與正則表達式匹配而無需編寫解析器,因為這只是我項目的一小部分。謝謝!編輯:我想尋找一個字符串塊,并找到像u(i, j, k),u(i, j, k(1))或者只是u(<anything within this paired parens>)和他們更換到__u%array(i, j, k)和__u%array(i, j, k(1))我的Fortran語言翻譯應用。
查看完整描述

3 回答

?
FFIVE

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))*\)。


查看完整回答
反對 回復 2019-12-04
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

請檢查此答案,因為它基本上可以完成您嘗試做的事情(總之,使用正則表達式實際上是不可能的)


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 1498 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號