У этой проблемы было другое решение, которое не было упомянуто, поэтому я опубликую его здесь для завершения.Эта ситуация похожа на этот вопрос, чтобы ["сопоставить регулярное выражение с шаблоном, исключая ..."] [4]
Мы можем решить это с помощью простого простого выражения:
\([^)]*\)|(\s*,\s*)
Левая сторона чередования |
соответствует завершению (parentheses)
.Мы будем игнорировать эти матчи.Правая сторона сопоставляет запятые и окружающие пробелы с группой 1, и мы знаем, что они являются правильными апострофами, потому что они не совпадают с выражением слева.Мы заменим эти запятые чем-то отличительным, а затем разделим.
Эта программа показывает, как использовать регулярные выражения (см. Результаты внизу онлайн-демонстрации ):
import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;
class Program {
public static void main (String[] args) throws java.lang.Exception {
String subject = "a, b, c, search:(1, 2, 3), d";
Pattern regex = Pattern.compile("\\([^)]*\\)|(\\s*,\\s*)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, "SplitHere");
else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("SplitHere");
for (String split : splits) System.out.println(split);
} // end main
} // end Program
Ссылка
Как сопоставить (или заменить) шаблон, кроме ситуаций s1, s2, s3 ...