2016-11-16 124 views
0

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

例子:

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

该字符串的结果是错误的,我不知道如何解决这个问题,或者如果它甚至有可能 常用表达。

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

感谢您的帮助!

+1

尽量避免使用',(?=([^ \(] * \([^ \)] * \))* [^ \)] * $)' ,这是最后的手段。 –

+0

是只能使用括号或者使用关键字add(...)吗? –

+0

@LoicM。 “添加”仅仅是一个例子,可以是其他任何东西。主要观点是括号中的逗号不应该将字符串拆分! –

回答

0

您也可以做到这一点使用这个正则表达式:([^,(]+(?=,|$)|[\w]+\(.*\)(?=,|$))

regex online demo

考虑在此基础上的文字1, 2, 3, add(4, 5, add(6, 7, 8), 9), 10, 11它创建组逗号(不包围()

所以,outp ut将是:

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` 
+1

我要求提供regEx解决方案,您的答案在我的测试中看起来相当不错。所以我把你的选票作为正确的答案。但我的测试还显示,我发布为答案的java方法比这更快一点。因此我将使用java方法来解析字符串。 –

+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); 
    } 
    }