Ответ 1
Вы сопоставляете два символа, а не один. Использование (отрицательного) lookahead должно решить задачу:
(?![@',&])\\p{Punct}
Во-первых, я прочитал документацию, следуя
http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html
И я хочу найти любой символ пунктуации EXCEPT @', & но я не совсем понимаю.
Вот:
public static void main( String[] args )
{
// String to be scanned to find the pattern.
String value = "#`~!#$%^";
String pattern = "\\p{Punct}[^@',&]";
// Create a Pattern object
Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
// Now create matcher object.
Matcher m = r.matcher(value);
if (m.find()) {
System.out.println("Found value: " + m.groupCount());
} else {
System.out.println("NO MATCH");
}
}
Результат НЕТ МАТЧА.
Есть ли несоответствие?
Спасибо
MRizq
Вы сопоставляете два символа, а не один. Использование (отрицательного) lookahead должно решить задачу:
(?![@',&])\\p{Punct}
Вы можете использовать вычитание символов здесь:
String pat = "[\\p{Punct}&&[^@',&]]";
Вся картина представляет собой символьный класс, [...]
, который содержит \p{Punct}
класс POSIX символов, то &&
оператор пересечения и [^...]
отрицается класс символов.
Модификатор Unicode может понадобиться, если вы планируете также сопоставлять все знаки препинания Unicode:
String pat = "(?U)[\\p{Punct}&&[^@',&]]";
^^^^
Шаблон соответствует любой пунктуации (с \p{Punct}
), за исключением @
, '
, ,
и &
.
Если вам нужно исключить больше символов, добавьте их в класс отрицательных символов. Просто помните, что всегда избегайте -
, \
, ^
, [
и ]
внутри символьного класса/набора символов Java regex. Например, добавить обратную косую черту и -
может выглядеть так: "[\\p{Punct}&&[^@',&\\\\-]]"
или "[\\p{Punct}&&[^@',&\\-\\\\]]"
.
String value = "#'~!#$%^,";
String pattern = "(?U)[\\p{Punct}&&[^@',&]]";
Pattern r = Pattern.compile(pattern); // Create a Pattern object
Matcher m = r.matcher(value); // Now create matcher object.
while (m.find()) {
System.out.println("Found value: " + m.group());
}
Вывод:
Found value: #
Found value: !
Found value: #
Found value: %
Found value: ,