簡體   English   中英

我如何使用string#split來分隔帶分隔符的字符串+ - * /()和空格並將它們保留為額外的標記?

[英]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中,您將使用lexyacc或GNU flexbison 在Java中,您使用ANTLRJavaCC

但首先要為您的預期輸入(通常稱為輸入語言 )編寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM