【问题标题】:Using String.split() How can I split a string based on a regular expression excluding a certain string使用 String.split() 如何根据正则表达式拆分字符串,不包括某个字符串
【发布时间】:2020-01-19 08:10:03
【问题描述】:

我有这个字符串:

"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"

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

【问题讨论】:

  • 您声明“需要忽略->”,但您想要的结果包含->
  • 您使用的工具完全错误。此任务需要扫描仪和解析器。
  • @cybersam 感谢您的评论我修改了问题以澄清我的意思
  • 可能你需要.split("(?:[\\s()*+/^!@#%&,]|-(?!>))+")

标签: java regex split


【解决方案1】:

解决方案 1

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

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

你的代码:

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

请注意,我使用 \\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)));

regex demo

详情

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

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

输出

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

【讨论】:

  • 巧妙的想法,用空格替换特殊字符,直接用空格分割。
  • 谢谢@Govinda Sakhare,我强烈建议您使用第二种解决方案
  • 请对 DV 有任何想法
【解决方案2】:

可以看到 YCF_L

提供的几个非常好的解决方案

这里还有一个解决方案:

String[] tokens = function.replace(")","").split("\\(+|\\*|/|,");

解释:

\\(+ 将被(+ 分开,将确保多个开括号情况并处理例如round((

|\\*|/|,* 拆分或/ 拆分或, 拆分

输出:

round
TOTAL_QTY 
100 
SUM
ORDER_ITEMS->TOTAL_QTY 
1

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 2012-06-14
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多