Пунктуация Regex в Java - PullRequest
       1

Пунктуация Regex в Java

13 голосов
/ 20 ноября 2011

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

http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html

И я хочу найти любой знак пунктуации, КРОМЕ @ ', но я не совсем понимаю.

Вот это:

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

Ответы [ 2 ]

30 голосов
/ 20 ноября 2011

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

(?![@',&])\\p{Punct}
1 голос
/ 11 июля 2018

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

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: ,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...