【问题标题】:java Regex - split but ignore text inside quotes?java Regex - 拆分但忽略引号内的文本?
【发布时间】:2012-06-07 12:52:27
【问题描述】:

仅使用正则表达式方法,方法 String.replaceAll 和 ArrayList 如何将字符串拆分为标记,但忽略引号内存在的分隔符? 分隔符是任何不是字母数字或引用文本的字符

例如: 字符串:

hello^world'这个*有两个标记'

应该输出:

  • 你好
  • worldthis* 有两个标记

【问题讨论】:

  • 你知道你的分隔符是什么样子的,所以你不需要正则表达式,你需要在分隔符上分割字符串。为正确的工作使用正确的工具。
  • 我不知道,分隔符可以是任何不是字母的字符
  • 那么你的问题是不正确的。决定你的分隔符是什么,然后相应地分割字符串。
  • @babybang:如果输入包含不匹配的报价会发生什么?为什么您的预期输出中缺少引号?
  • @JackManey:这个问题不是“格式错误”。是的,稍微未指定,但它比此处的大多数问题指定的要好得多。

标签: java regex


【解决方案1】:

你不能以任何合理的方式。你提出了一个正则表达式不擅长的问题。

【讨论】:

  • 我非常相信正则表达式的定义。请参阅 Jack Maney 的评论。
  • 如果你认为正则表达式不适合这个,你能至少展示一个替代/更好的方法吗?除非您可以提出更好的建议,否则此答案不会帮助 OP(或其他任何人)。
  • OK 说,“只使用正则表达式。”我很高兴支持您的回答,但除了回答字面问题之外,我不会回答此类问题。
【解决方案2】:

不要为此使用正则表达式。它行不通。改用/编写解析器。

您应该为正确的任务使用正确的工具。

【讨论】:

    【解决方案3】:

    使用Matcher 标识您要保留的部分,而不是您要拆分的部分:

    String s = "hello^world'this*has two tokens'";
    Pattern pattern = Pattern.compile("([a-zA-Z0-9]+|'[^']*')+");
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()) {
        System.out.println(matcher.group(0));
    }
    

    在线查看:ideone

    【讨论】:

      【解决方案4】:

      我知道已经存在一个该死的好且可接受的答案,但我想添加另一种基于正则表达式(我可以说更简单)的方法来使用不在单引号内的任何非字母数字分隔符拆分给定文本使用

      正则表达式:

      /(?=(([^']+'){2})*[^']*$)[^a-zA-Z\\d]+/
      

      这基本上意味着匹配一个非字母数字文本,如果它后跟偶数个单引号,换句话说,如果它在单引号之外匹配一个非字母数字文本。

      代码:

      String string = "hello^world'this*has two tokens'#2ndToken";
      System.out.println(Arrays.toString(
           string.split("(?=(([^']+'){2})*[^']*$)[^a-zA-Z\\d]+"))
      );
      

      输出:

      [hello, world'this*has two tokens', 2ndToken]
      

      演示:

      Here is a live working Demo of the above code.

      【讨论】:

        猜你喜欢
        • 2016-03-08
        • 1970-01-01
        • 2010-12-17
        • 2011-12-25
        • 2020-08-03
        相关资源
        最近更新 更多