【问题标题】:Splitting a comma separated string and extracting specific values拆分逗号分隔的字符串并提取特定值
【发布时间】:2013-02-07 21:35:48
【问题描述】:

我有一个查询,它连接两列的值并返回一个字符串,如下所示:

423545(50),AXX-10, ABB-1234X(30), 7568787(50),53654656,2021947(50),ABCD-2343423,FDKHD-324342(20),

我想拆分该字符串并将其放入一个数组中,丢弃括号中的所有值。输出如下图:

[423545,AXX-10, ABB-1234X, 7568787,53654656,2021947,ABCD-2343423,FDKHD-324342]
  • 字符串末尾的逗号是可选的
  • 并非所有列都包含括号内的值

我知道我可以使用 String.split() 但可选的括号值和字符串末尾的逗号会使它复杂化。

提前致谢。

【问题讨论】:

  • 向我们展示您的尝试。

标签: java regex string parsing


【解决方案1】:

你可以分成两种模式:-

  • \\(\\d+\\),[ ]* 上的一个,它将处理括号中的术语
  • 其次是,[ ]*,这将适用于正常的, 分隔值。

您只需使用pipe(|) 合并这些正则表达式,然后立即执行拆分。

因此,您的拆分标准变为:-

str.split("(?:\\(\\d+\\),[ ]*)|(?:,[ ]*)");

可以进一步简化为:-

str.split("(?:\\(\\d+\\))?,[ ]*");

我们只是做了一个可选的部分,把公共的部分放在外面。

【讨论】:

  • 由于从左到右扫描,相当于(?:\\(\\d+\\))?,[ ]*
  • 不,这并不重要...根据阅读正则表达式的方式,您的意图可能更容易阅读,因为第一项总是先于其他项尝试。
  • @nhahtdh.. 是的,但是,这确实是不必要的重复。感谢您指出这一点。
  • d+ 不会只选择数字吗?如果我将 w+ 用于字母数字会有什么影响?
  • @ziggy.. 你可以用任何东西代替\d+。无论如何,这将提取括号内的内容。
【解决方案2】:

类似

([a-zA-Z\-\d]+)[()\d]*,*

?我对它进行了测试here,它似乎有效:如果第 0 个是整个匹配项,则您可以将令牌插入到第 1 组的结果字符串中。

【讨论】:

    【解决方案3】:

    可以过滤掉括号中的值,然后拆分。

        String str = "423545(50),AXX-10, ABB-1234X(30), 7568787(50),53654656,2021947(50),ABCD-2343423,FDKHD-324342(20)";
    
        String str2 = str.replaceAll("\\(\\d+\\)", "");
        for (String string : str2.split(",")) {
            System.out.println(string);
        }
    

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2013-01-03
      • 2012-05-24
      相关资源
      最近更新 更多