java - 使用 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"
让它更清楚。首先,->
当它拆分字符串时我需要忽略,然后删除结果数组中的那些空字符串。
解决方案
解决方案 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"
推荐阅读
- mysql - 从选择中查询 SQL 更新
- python - sqlalchemy 数据库 uri 未设置
- php - 如何将多个 GET 参数连接到准备好的语句中
- image - 如何将 BufferedImage RDD 保存为 HDFS 文件
- excel - 如何在 VBA 事件驱动编程中的工作表 SelectionChange 过程中创建动态范围?
- angular - 如何在全局范围内正确设置 Angular 语言环境?
- php - 检查在 Woocommerce 结帐期间注册的用户
- xcode - 无法在 macOS 10.13.6 及更高版本上加载 KEXT
- visual-studio - VisualStudio PathTooLongException
- javascript - 我可以在 Xpath 的量角器搜索元素中使用循环概念吗?