POSIX-регулярное выражение без учета регистра не учитывает регистр в Java Pattern & Matcher - PullRequest
0 голосов
/ 24 декабря 2018

Я не эксперт в Regex, возможно, это очевидная причина, но я не могу найти ответ на этот вопрос.

Я использую нотацию POSIX для сопоставления строки (n) с использованием Regex в Java без учета регистра.Дано:

Pattern pattern = Pattern.compile("\\p{Upper}", Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern.matcher("n");

Почему следующий код приводит к false?

boolean find = matcher.find();

В документации Pattern я нашел следующее (подчеркивает мое):

\ p {Upper} Буквенный буквенный символ: [AZ]

Проверено на соответствиеRegex [A-Z], следующие результаты в true:

Pattern pattern = Pattern.compile("[A-Z]", Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern.matcher("n");
boolean find = matcher.find();

В чем разница?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Из спецификации POSIX (IEEE 1003):

9.2 Общие требования регулярного выражения

Когда стандартная утилита или функция, использующая регулярные выражения, задает этот шаблонсопоставление должно выполняться без учета регистра (верхнего или нижнего регистра) данных или шаблонов, тогда, когда каждый символ в строке сопоставляется с шаблоном, должен быть не только символ, но и его аналог регистра (если есть)соответствует.

При использовании классов символов POSIX, Pattern.CASE_INSENSITIVE не заставляет игнорировать контрольную проверку регистра.

0 голосов
/ 24 декабря 2018

Правильно или неправильно - классы символов Posix игнорируют флаг CASE_INSENSITIVE.Хотя \p{Upper} работает как [A-Z], это не совсем то же самое - и он не учитывает флаг без учета регистра.

Код в классе Pattern, который проверяет классы posic, несм. флаг CASE_INSENSITIVE:

/**
 * Node class that matches a POSIX type.
 */
static final class Ctype extends BmpCharProperty {
    final int ctype;
    Ctype(int ctype) { this.ctype = ctype; }
    boolean isSatisfiedBy(int ch) {
        return ch < 128 && ASCII.isType(ch, ctype);
    }
}
...