我见过很多例子,但我没有得到预期的结果。
给定一个字符串:
"manikanta, Santhosh, ramakrishna(mani, santhosh), tester"
我想得到String数组如下:
manikanta,
Santhosh,
ramakrishna(mani, santhosh),
tester
我尝试了以下正则表达式(来自另一个例子):
"(\".*?\"|[^\",\\s]+)(?=\\s*,|\\s*$)"
答案 0 :(得分:2)
这就是这个伎俩:
String[] parts = input.split(", (?![^(]*\\))");
使用负向前瞻来断言下一个括号char 不是一个近括号,并产生:
manikanta
Santhosh
ramakrishna(mani, santhosh)
tester
根据你的问题所需的输出保留尾随逗号,我认为这是一个疏忽,但是如果你真的想要保留逗号:
String[] parts = input.split("(?<=,) (?![^(]*\\))");
生成相同的内容,但 with 尾随的逗号完整无缺:
manikanta,
Santhosh,
ramakrishna(mani, santhosh),
tester
答案 1 :(得分:0)
假设我们可以用空格分割(由于你的例子),那么你可以试试这个正则表达式\s+(?=([^\)]*\()|([^\)\(]*$))
,如:
String str = "manikanta, Santhosh, ramakrishna(mani, santhosh), ramakrishna(mani, santhosh), tester";
String[] ar = str.split("\\s+(?=([^\\)]*\\()|([^\\)\\(]*$))");
其中:
\s+
任意数量的空格
(?=...)
正向前瞻,意味着在当前位置必须是字符串后,匹配到([^\\)]*\\()
或|
到([^\\)\\(]*$)
([^\\)]*\\()
忽略(和)
([^\\)\\(]*$))
所有空格,如果它们后面没有(和),则此处用于分割带有tester
字的部分
答案 2 :(得分:-1)
正如我在对这个问题的评论中所述,正则表达式可能无法解决这个问题。
以下代码(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,数组边界,......)。