我如何使用string#split来分隔带分隔符的字符串+ - */()和空格并将它们保留为额外的标记?

Thi*_*use 5 java regex string parsing

我需要拆分包含基本数学表达式的字符串,例如:
"(a+b)*c"
或者
" (a - c) / d"
分隔符是+ - */()和空格,我需要它们作为独立的标记.基本上结果应如下所示:

"("
"a"
"+"
"b"
")"
"*"
"c"

而对于第二个例子:

" "
"("
"a"
" "
"-"
...

我阅读了很多关于类似问题的问题,而不太复杂的分隔符,常见的答案是使用零空间正向前瞻和后方.
像这样:(?<=X | ?=X)
X表示分隔符,但是将它们放在这样的类中:
[\\Q+-*()\\E/\\s]
不能以所需的方式工作.
那么我如何格式化分隔符以使分割工作我需要它?

---更新---
不应拆分Word类字符和更长的组合.
例如"ab""c1"或"12".
或者简而言之,我需要与StringTokenizer相同的结果,给出参数" - +*/()"和true.

Psh*_*emo 1

尝试使用分割数据

yourString.split("(?<=[\\Q+-*()\\E/\\s])|(?=[\\Q+-*()\\E/\\s])(?<!^)"));
Run Code Online (Sandbox Code Playgroud)

我认为您遇到的问题不是部分问题\\Q+-*()\\E,而是在(?<=X | ?=X)<-中(?<=X)|(?=X),因为它应该产生后视和前视。


演示"_a+(ab-c1__)+12_" (顺便说一句_,代码中将替换为空格。SO 将两个空格显示为一个,因此必须使用__某种方式来呈现它们)

String[] tokens = " a+(ab-c1  )+12 "
        .split("(?<=[\\Q+-*()\\E/\\s])|(?=[\\Q+-*()\\E/\\s])(?<!^)");
for (String token :  tokens)
    System.out.println("\"" + token + "\"");
Run Code Online (Sandbox Code Playgroud)

结果

" "
"a"
"+"
"("
"ab"
"-"
"c1"
" "
" "
")"
"+"
"12"
" "
Run Code Online (Sandbox Code Playgroud)