使用 String.split() 如何根据不包括某个字符串的正则表达式拆分字符串

a.t*_*aby 6 java regex split

我有这个字符串:

"round((TOTAL_QTY * 100) / SUM(ORDER_ITEMS->TOTAL_QTY) , 1)"
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码拆分字符串:

String[] tokens = function.split("[ )(*+-/^!@#%&]");
Run Code Online (Sandbox Code Playgroud)

结果是以下数组:

"round"
""
"TOTAL_QTY"
""
""
"100"
""
""
""
"SUM"
"ORDER_ITEMS"
"->TOTAL_QTY"
""
""
""
"1"
Run Code Online (Sandbox Code Playgroud)

但我需要按如下方式拆分字符串:

"round",
"TOTAL_QTY",
"100",
"SUM",
"ORDER_ITEMS->TOTAL_QTY",
"1"
Run Code Online (Sandbox Code Playgroud)

为了使它更清楚。首先,我需要->在拆分字符串时忽略,然后删除结果数组中的那些空字符串。

YCF*_*F_L 4

解决方案1

好的,我认为您可以分两步完成,例如用空格替换所有非必需字符,然后用空格分割,您的正则表达式可以如下所示:

[)(*+/^!@#%&,]|\\b-\\b
Run Code Online (Sandbox Code Playgroud)

你的代码:

String[] tokens = function.replaceAll("[)(*+/^!@#%&,]|\\b-\\b", " ").split("\\s+");
Run Code Online (Sandbox Code Playgroud)

请注意,我过去\\b-\\b只替换-

解决方案2

或者如果你想要一些干净的东西,你可以使用 Pattern 和 Matcher ,如下所示:

Pattern.compile("\\b\\w+->\\w+\\b|\\b\\w+\\b")
        .matcher("round((TOTAL_QTY * 100) / SUM(ORDER_ITEMS->TOTAL_QTY) , 1)")
        .results()
        .map(MatchResult::group)
        .forEach(s -> System.out.println(String.format("\"%s\"", s)));
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

细节

  • \b\w+->\w+\b来匹配这个特殊情况ORDER_ITEMS->TOTAL_QTY
  • |或者
  • \b\w+\b任何其他带有单词边界的单词

请注意,此解决方案适用于 Java9+,但您可以使用简单的模式和匹配器解决方案。

输出

"round"
"TOTAL_QTY"
"100"
"SUM"
"ORDER_ITEMS->TOTAL_QTY"
"1"
Run Code Online (Sandbox Code Playgroud)