【问题标题】:Regex to split parameters正则表达式拆分参数
【发布时间】:2016-11-16 09:54:29
【问题描述】:

我正在寻找一个用逗号分割字符串的正则表达式。听起来很简单,但还有一个限制。字符串上的参数可以有括号括起来的逗号,不应拆分字符串。

例子:

1, 2, 3, add(4, 5, 6), 7, 8
 ^  ^  ^      !  !   ^  ^

字符串只能用 ^ 标记的逗号分隔,不能用!。

我在这里找到了解决方案:A regex to match a comma that isn't surrounded by quotes

正则表达式:

,(?=([^\(]*\([^\)]*\))*[^\)]*$)

但我的字符串可能更复杂:

1, 2, 3, add(4, 5, add(6, 7, 8), 9), 10, 11
 ^  ^  ^      !  !      !  !   !   ^   ^

对于这个字符串,结果是错误的,我不知道如何解决这个问题,或者是否可以使用正则表达式。

有人知道如何解决这个问题吗?

感谢您的帮助!

【问题讨论】:

  • 尽量避免使用,(?=([^\(]*\([^\)]*\))*[^\)]*$),这是不得已而为之的手段。
  • 是转义只是括号还是你使用关键字add(...)?
  • @LoicM。 “添加”在这里只是一个例子,可以是其他任何东西。要点是括号中的逗号不应该拆分字符串!
  • 你必须写一个解析器
  • 同意@TheLostMind。正则表达式解决方案过于复杂,无法满足您的需求。

标签: java regex string


【解决方案1】:

好的,我认为正则表达式对此不是很有用。一小块java可能会更容易。

这是我解决问题的java代码:

public static void splitWithJava() {
    String EXAMPLE = "1, 2, 3, add(4, 5, add(7, 8), 6), 7, 8";
    List<String> list = new ArrayList<>();
    int start = 0;
    int pCount = 0;
    for (int i = 0; i < EXAMPLE.length(); i++) {
      char c = EXAMPLE.charAt(i);
      switch (c) {
      case ',': {
        if (0 == pCount) {
          list.add(EXAMPLE.substring(start, i).trim());
          start = i + 1;
        };
        break;
      }
      case '(': {
        pCount++;
        break;
      }
      case ')': {
        pCount--;
        break;
      }
      }
    }
    list.add(EXAMPLE.substring(start).trim());
    for (String str : list) {
      System.out.println(str);
    }
  }

【讨论】:

    【解决方案2】:

    您也可以使用此正则表达式来实现此目的:([^,(]+(?=,|$)|[\w]+\(.*\)(?=,|$))

    regex online demo

    考虑到此文本1, 2, 3, add(4, 5, add(6, 7, 8), 9), 10, 11,它基于逗号创建组(不被()包围)

    所以,输出将是:

    Match 1
    Group 1.    0-1    `1`
    
    Match 2
    Group 1.    2-4    ` 2`
    
    Match 3
    Group 1.    5-7    ` 3`
    
    Match 4
    Group 1.    9-35    `add(4, 5, add(6, 7, 8), 9)`
    
    Match 5
    Group 1.    36-39    ` 10`
    
    Match 6
    Group 1.    40-43    ` 11`
    

    【讨论】:

    • 我要求提供正则表达式解决方案,您的答案在我的测试中看起来相当不错。所以我投票给你作为正确答案。但我的测试也表明,我作为答案发布的 java 方法比这快一点。因此我将使用java方法来解析字符串。
    • 黑魔法.. 当我认输并发现这一点时,我正试图用递归模式来实现这一点。太棒了
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2013-08-11
    相关资源
    最近更新 更多