Подтвердить что ты не робот

Регулярное выражение пунктуации в Java

Во-первых, я прочитал документацию, следуя

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

4b9b3361

Ответ 1

Вы сопоставляете два символа, а не один. Использование (отрицательного) lookahead должно решить задачу:

(?![@',&])\\p{Punct}

Ответ 2

Вы можете использовать вычитание символов здесь:

String pat = "[\\p{Punct}&&[^@',&]]";

Вся картина представляет собой символьный класс, [...], который содержит \p{Punct} класс POSIX символов, то && оператор пересечения и [^...] отрицается класс символов.

Модификатор Unicode может понадобиться, если вы планируете также сопоставлять все знаки препинания Unicode:

String pat = "(?U)[\\p{Punct}&&[^@',&]]";
              ^^^^

Шаблон соответствует любой пунктуации (с \p{Punct}), за исключением @, ', , и &.

Если вам нужно исключить больше символов, добавьте их в класс отрицательных символов. Просто помните, что всегда избегайте -, \, ^, [ и ] внутри символьного класса/набора символов Java regex. Например, добавить обратную косую черту и - может выглядеть так: "[\\p{Punct}&&[^@',&\\\\-]]" или "[\\p{Punct}&&[^@',&\\-\\\\]]".

Java-демонстрация:

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: ,