首页 > 解决方案 > 使用 String.split() 如何根据正则表达式拆分字符串,不包括某个字符串

问题描述

我有这个字符串:

"round((TOTAL_QTY * 100) / SUM(ORDER_ITEMS->TOTAL_QTY) , 1)"

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

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

结果是以下数组:

"round"
""
"TOTAL_QTY"
""
""
"100"
""
""
""
"SUM"
"ORDER_ITEMS"
"->TOTAL_QTY"
""
""
""
"1"

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

"round",
"TOTAL_QTY",
"100",
"SUM",
"ORDER_ITEMS->TOTAL_QTY",
"1"

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

标签: javaregexsplit

解决方案


解决方案 1

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

[)(*+/^!@#%&,]|\\b-\\b

你的代码:

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

请注意,我曾经\\b-\\b只替换-

解决方案 2

或者如果你想要一些干净的东西,你可以像这样使用带有 Matcher 的 Pattern:

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)));

正则表达式演示

细节

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

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

输出

"round"
"TOTAL_QTY"
"100"
"SUM"
"ORDER_ITEMS->TOTAL_QTY"
"1"

推荐阅读