我有这个字符串:
"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)
为了使它更清楚。首先,我需要->在拆分字符串时忽略,然后删除结果数组中的那些空字符串。
好的,我认为您可以分两步完成,例如用空格替换所有非必需字符,然后用空格分割,您的正则表达式可以如下所示:
[)(*+/^!@#%&,]|\\b-\\b
Run Code Online (Sandbox Code Playgroud)
你的代码:
String[] tokens = function.replaceAll("[)(*+/^!@#%&,]|\\b-\\b", " ").split("\\s+");
Run Code Online (Sandbox Code Playgroud)
请注意,我过去\\b-\\b只替换-:
或者如果你想要一些干净的东西,你可以使用 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)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |