Классы символов отменяют только отдельные символы и не могут отрицать шаблон, как вы пытались.
Вы можете использовать это регулярное выражение, которое использует осмотр для отклонения строк, которые заключены в двойные кавычки,
(?!<")\b\w+\b(?!")
Здесь граница слова \b
гарантирует, что частичное слово не должно быть обнаружено как совпадение. Например, в слове "libero"
, если мы не поместим \b
вокруг регулярного выражения, то оно может обнаружить iber
как совпадение с середины этого слова.
Демо
Java-код для того же был бы,
String s = "Lorem ipsum mauris \"libero\" non \"pulvinar\" suscipit, nis \"aenean\" curae odio lobortis \"nulla\" suspendisse";
Pattern p = Pattern.compile("(?!<\")\\b\\w+\\b(?!\")");
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
Какие отпечатки,
Lorem
ipsum
mauris
non
suscipit
nis
curae
odio
lobortis
suspendisse
Edit:
Я понял, что вы также хотите получить запятую ,
в виде совпавшей строки, поэтому в этом случае вы можете немного изменить регулярное выражение, чтобы сказать это так,
(?!<")\b\w+\b(?!")|,
Хотя теперь я предполагаю, что в вашей строке могут быть и другие специальные символы, отличные от запятой, и в этом случае вы можете использовать такой класс символов, как этот [,.!;]
, а не просто запятую. Кроме того, в зависимости от того, как вы хотите сгруппировать эти символы, будь то непрерывно, например ,;!
(затем используйте [,.!;]+
) или каждый из этих специальных символов по отдельности, просто сохраните класс символов.