[英]How can i use string#split to split a string with the delimiters + - * / ( ) and space and retain them as an extra token?
我需要拆分包含基本數學表達式的字符串,例如:
"(a+b)*c"
要么
" (a - c) / d"
分隔符是+ - * /()和空格,我需要它們作為獨立的標記。 基本上結果應如下所示:
"("
"a"
"+"
"b"
")"
"*"
"c"
而對於第二個例子:
" "
"("
"a"
" "
"-"
...
我閱讀了很多關於類似問題的問題,而不太復雜的分隔符,常見的答案是使用零空間正向前瞻和后方。
像這樣: (?<=X | ?=X)
X表示分隔符,但將它們放在這樣的類中:
[\\\\Q+-*()\\\\E/\\\\s]
不能以所需的方式工作。
那么我如何格式化分隔符以使分割工作我需要它?
---更新---
不應拆分Word類字符和更長的組合。
例如“ab”“c1”或“12”。
或者簡而言之,我需要與StringTokenizer相同的結果,給出參數“ - + * /()”和true。
如果你是作為學生工作這樣做是一回事,但在實踐中,這對於詞法分析器和解析器來說更像是一項工作。 在C中,您將使用lex
和yacc
或GNU flex
和bison
。 在Java中,您使用ANTLR
或JavaCC
。
但首先要為您的預期輸入(通常稱為輸入語言 )編寫BNF語法。
嘗試使用分割數據
yourString.split("(?<=[\\Q+-*()\\E/\\s])|(?=[\\Q+-*()\\E/\\s])(?<!^)"));
我假設你遇到的問題不在\\\\Q+-*()\\\\E
部分但在(?<=X | ?=X)
< - 應該是(?<=X)|(?=X)
它應該產生后視和前瞻。
"_a+(ab-c1__)+12_"
演示(BTW _
將在代碼中用空格替換.SO顯示兩個空格為一,所以不得不使用__
以某種方式呈現它們)
String[] tokens = " a+(ab-c1 )+12 "
.split("(?<=[\\Q+-*()\\E/\\s])|(?=[\\Q+-*()\\E/\\s])(?<!^)");
for (String token : tokens)
System.out.println("\"" + token + "\"");
結果
" "
"a"
"+"
"("
"ab"
"-"
"c1"
" "
" "
")"
"+"
"12"
" "
試試這個:
[-+*()\\s]
破折號必須在字符類中排在第一位或最后一位才能表示范圍 。 其余的角色不需要逃避(大概是你試圖用\\\\Q
和\\\\E
),因為大多數角色無論如何都是在角色類中。
另外,我不知道語法, (?<=X|?=X)
。 如果它有效,那么很棒。 但是,如果沒有的話,試試這個相當於擴大,其語法我知道做的工作:
(?:(?<=X)|(?=X))
您可以使用以下正則表達式:
\s*(?<=[()+*/a-z-])\s*
?<=
進行零問題斷言,即它們匹配,但不包括組中匹配的表達式。 \\s*
將處理尾隨空格。
代碼示例:
String a = " (a - c) / d * x ";
String regex = "\\s*(?<=[()+*/a-z-])\\s*";
String[] split = a.split(regex);
System.out.println(Arrays.toString(split));
輸出:
[ (, a, -, c, ), /, d, *, x]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.