正则表达式分割参数

时间:2016-11-16 09:54:30

标签: java regex string

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

示例:

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
 ^  ^  ^      !  !      !  !   !   ^   ^

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

好的,我认为正则表达式对此并不是很有用。一小段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);
    }
  }

答案 1 :(得分:0)

您也可以使用此正则表达式实现此目的:([^,(]+(?=,|$)|[\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`
相关问题