Павел, воскрешает этот вопрос, потому что у него было простое решение, которое не было упомянуто.(Нашел свой вопрос, когда проводил некоторые исследования для regex bounty quest .)
Также существующее решение проверяет, что запятая не сопровождается круглыми скобками, но это не гарантирует, что этов скобках.
Регулярное выражение очень просто:
\(.*?\)|(,)
Левая часть чередования соответствует полному набору скобок.Мы будем игнорировать эти матчи.Правая сторона сопоставляет и вводит запятые в Группу 1, и мы знаем, что они являются правыми запятыми, потому что они не совпадают с выражением слева.
В этом demo вы можете видетьГруппа 1 захватывает в нижней правой панели.
Вы сказали, что хотите сопоставить запятые, но вы можете использовать ту же общую идею для разделения или замены.
Чтобы сопоставить запятые, вынеобходимо осмотреть группу 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 = "12,44,foo,bar,(23,45,200),6";
Pattern regex = Pattern.compile("\\(.*?\\)|(,)");
Matcher regexMatcher = regex.matcher(subject);
List<String> group1Caps = new ArrayList<String>();
// put Group 1 captures in a list
while (regexMatcher.find()) {
if(regexMatcher.group(1) != null) {
group1Caps.add(regexMatcher.group(1));
}
} // end of building the list
// What are all the matches?
System.out.println("\n" + "*** Matches ***");
if(group1Caps.size()>0) {
for (String match : group1Caps) System.out.println(match);
}
} // end main
} // end Program
Вот демоверсия live
Чтобы использовать ту же технику для разделения или замены, см. Примеры кода в статье в ссылке.
Ссылка
- Как сопоставить шаблон, кроме как в ситуациях s1, s2, s3
- Какчтобы соответствовать шаблону, если ...