我試圖拆分||
,&&
和()
上的一個字符串,並且我無法正確拆分嵌套圓括號。在多個標記上拆分一個帶有嵌套圓括號的字符串
例字符串:
q1 == false || (q1 == true && q3 != null && (method(param) - method()) > 120)
我當前正則表達式/代碼:
String[] tempTokens = input.split("(?=([|]{2}|[&]{2}|[(]|[)]))|(?<=([|]{2}|[&]{2}|[(]|[)]))");
for (String token : tempTokens) {
if (token.trim().length() > 0) {
System.out.println(token.trim());
}
}
電流輸出:
q1 == false
||
(
q1 == true
&&
q3 != null
&&
(
method
(
param
)
- method
(
)
)
> 120
)
求購輸出:
q1 == false
||
(
q1 == true
&&
q3 != null
&&
(method(param) - method()) > 120
)
基本上,我試圖來標記的表達,我想在括號分割只有在包含一個完整的語句包含>
,>=
,==
等
Java的正則表達式引擎沒有匹配平衡的文本(嵌套)的能力。所以,它不能匹配'(方法(參數) - 方法())' – sln
這將是濫用正則表達式,並且你會寫出一個很長的,可能有問題的表達式。正則表達式用於*常規語法*。您顯示的代碼是上下文無關的。看看[常規VS上下文無關文法](https://stackoverflow.com/questions/559763/regular-vs-context-free-grammars)和[解析如果語句與正則表達式](https:// stackoverflow。com/questions/651455/regular-expression-to-identify-if-statements) –
如果正則表達式看起來很複雜,那麼在下一次代碼重寫時可能會失去它,因爲下一個開發人員無法繞開邏輯或者你冒着創建時間複雜性問題的風險(我見過這種情況發生)。這意味着你應該看看如何簡化正則表達式或找到一種不同的方法來標記字符串。在你的情況下,你似乎在處理語言語法,所以一個簡單的「有限狀態機」可能是需要的方法? –