我看过很多例子,但是我没有得到预期的结果。
给定一个字符串:
"manikanta, Santhosh, ramakrishna(mani, santhosh), tester"
我想得到字符串数组如下:
manikanta,
Santhosh,
ramakrishna(mani, santhosh),
tester
我尝试了以下正则表达式(从另一个例子中得到):
"(".*?"|[^",\s]+)(?=\s*,|\s*$)"
效果如下:
String[] parts = input.split(", (?![^(]*\))");
使用负预判来断言下一个括号字符是而不是是右括号,并产生:
manikanta
Santhosh
ramakrishna(mani, santhosh)
tester
根据您的问题所需的输出保留尾随逗号,我认为这是一个疏忽,但如果您真的想要保留逗号:
String[] parts = input.split("(?<=,) (?![^(]*\))");
生成相同的,但是后面的逗号完整:
manikanta,
Santhosh,
ramakrishna(mani, santhosh),
tester
假设,我们可以用空格分割(由于您的示例),那么您可以尝试这个正则表达式s+(?=([^)]*()|([^)(]*$))
,如:
String str = "manikanta, Santhosh, ramakrishna(mani, santhosh), ramakrishna(mani, santhosh), tester";
String[] ar = str.split("\s+(?=([^\)]*\()|([^\)\(]*$))");
地点:
s+
任意数量的空格
(?=...)
正向前看,意味着当前位置之后必须是匹配([^\)]*\()
或|
到([^\)\(]*$)
的字符串
([^\)]*\()
忽略(and)中的空白
([^\)\(]*$))
所有空白,如果它们后面没有(and),这里用于用tester
字
正如我在对这个问题的评论中所说,这个问题可能无法通过正则表达式解决。
下面的代码(java)给出了一个提示:
private void parse() {
String string = null;
char[] chars = string.toCharArray();
List<String> parts = new ArrayList<String>();
boolean split = true;
int lastEnd = 0;
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
switch (c) {
case '(':
split = false;
break;
case ')':
split = true;
break;
}
if (split && c == ',') {
parts.add(string.substring(lastEnd, i - 1));
lastEnd = i++;
}
}
}
请注意,代码缺少一些约束检查(提供字符串为null,数组边界,…)。