我正在寻找一个正则表达式来分割逗号上的字符串。听起来很简单,但还有另一个限制。字符串上的参数可以用括号括起来的逗号,不应该拆分字符串。
示例:的
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
^ ^ ^ ! ! ! ! ! ^ ^
对于这个字符串,结果是错误的,我不知道如何解决这个问题,或者甚至可以使用正则表达式。
有谁知道如何解决这个问题?
感谢您的帮助!
答案 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]+\(.*\)(?=,|$))
考虑此文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`