在 Java 中拆分字符串时标记会粘住吗?

Tokens stick when splitting a String in Java?

我试图在不依赖空格的情况下将测试字符串“1 + 2 = 3 += 4 + --5”拆分为其组件。我希望最终结果是 { 1, +, 2, =, 3, +=, 4, +, --, 5 } 但是有些标记似乎粘在一起。我编写了以下正则表达式来拆分字符串:

"(?<=(\.)|(\w))\s*(?=[O])|(?<=[O])\s*(?=(\.)|(\w))"

然后使用 ReplaceAll 函数将 "O" 替换为以下内容,这是我要拆分的运算符:

"(\\+)|(\\=)|(\\+=)|(\\-)"

然而,当应用此正则表达式拆分我作为示例提供的字符串时,我得到以下结果:{ 1, +, 2, =, 3, +=, 4, +--, 5 }。为什么在倒数第二个标记中减号会粘在加号上?无论如何要解决这个问题并使拆分标记显示为 { 1, +, 2, =, 3, +=, 4, +, --, 5 }?

您可以进行匹配而不是拆分。

String a = "1 + 2 = 3 += 4 +--5";
Matcher m = Pattern.compile("\d+|[^\w\s]+").matcher(a);
ArrayList<String> list = new ArrayList<String>();
while (m.find()) {
    list.add(m.group());
}
System.out.println(list);

输出:

[1, +, 2, =, 3, +=, 4, +--, 5]

试试这个:

String input = "1 + 2 = 3 += 4 + --5";
//StringTokenizer stringTokenizer = new StringTokenizer(input, " ");
StringTokenizer stringTokenizer = new StringTokenizer(input, "1234567890", true);

StringBuilder builder = new StringBuilder("[");

while (stringTokenizer.hasMoreElements()) {
  //builder.append(stringTokenizer.nextElement());
  builder.append(stringTokenizer.nextElement().toString().trim());
  builder.append(stringTokenizer.hasMoreTokens() ? "," : "]");
}
System.out.printf("Using the java.util.StringTokenizer: %s%n", builder);

输出:

Using the java.util.StringTokenizer: [1, +, 2, =, 3, +=, 4, +, --5]