TL; DR - Нет.
Спецификацией, которую вы читаете / цитируете, является SUS Открытой группы ( S один U NIX® S pecification) версия части регулярного выражения POSIX IEEE ( P ortable O perating S ystem I nterface дляуни х ) сборник стандартов.(См. https://www.regular -expressions.info / posix.html ¹)
Как правило, только POSIX-совместимые движки регулярных выражений полностью поддерживают выражения скобок POSIX , которыепо сути, это то, что другие разновидности regex называют классами символов, но с несколькими специальными функциями, одна из которых заключается в том, что [.
и .]
интерпретируются как начало и конец последовательности сортировки при использовании в выражениях.
К сожалениюочень немногие движки регулярных выражений являются POSIX-совместимыми, и, фактически, некоторые утверждают, что реализуют регулярные выражения POSIX, просто используют синтаксис регулярных выражений, определенный POSIX, и не имеют полной поддержки locale .Таким образом, они не реализуют все / какие-либо особенности / причуды скобочных выражений.
Регулярные выражения Java никоим образом не POSIX-совместимы, как видно из этой Сравнительной диаграммы механизма регулярных выражений ².В его пакете regex
реализован движок регулярных выражений типа «Perl», в котором отсутствуют некоторые функции (например, условные выражения и комментарии), но есть некоторые дополнительные (например, квантификаторы притязаний и переменные длины, но конечные, проверочные утверждения).
Ни Perl, ни Java не поддерживают разделители скобок, связанные с сопоставлением [=
и =]
(эквивалентность символов) или [.
и .]
(последовательность упорядочения).Perl поддерживает классы символов с использованием разделителей POSIX [:
и :]
, но Java поддерживает их только с помощью оператора \p
(с некоторыми оговорками, как объяснено здесь ).
Итак, что происходит с регулярным выражением [[.ch.]]*c
в Java?(Я игнорирую группу захвата, поскольку она не меняет анализ.)
Что ж, получается, что пакет regex
Java поддерживает объединения в своих классах символов.Это достигается путем вложения.Например, [<em>set1</em>[<em>set2</em>]]
эквивалентно [<em>set3</em>]
, где символы в <em>set3</em>
представляют собой объединение символов в <em>set1</em>
и символов в <em>set2</em>
.(Кроме того, обратите внимание, что [[<em>set1</em>][<em>set2</em>]]
и [[<em>set1</em>]<em>set2</em>]
также дают одинаковый результат.)
Итак, [[.ch.]]
- это просто класс символов, содержащий объединение пустого набора символов с наборомсимволы в классе символов [.ch.]
, так что в основном это то же самое, что и класс символов [.ch.]
.Это эквивалентно [.ch]
(поскольку второй .
является избыточным) и, таким образом, [[.ch.]]*c
совпадает с [.ch]*c
.
Аналогично, [[ch]]*c
упрощается до [ch]*c
.
Наконец, поскольку в строке chchch
нет символов .
, регулярные выражения [.ch]*c
и [ch]*c
приведут к тому же результату.(Попробуйте проверить строку c.hchch
, чтобы увидеть разницу и доказать вышеприведенное.)
Примечания:
Это не очень хороший пример длялибо демонстрации последовательностей сортировки, либо для обнаружения их реализации, поскольку [[.ch.]]*c
будет соответствовать chchc
в chchch
как при поддержке последовательностей сортировки (а ch
- допустимая последовательность в текущей локали), так и когда они не поддерживаются.но есть союзы.
Гораздо лучше демо / тест - использовать регулярное выражение [[.ch.]]
с тестовой строкой ch
:
- Поддерживаются последовательности сортировки, если
ch
- Любое другое совпадение означает, что это не так.
- Они могут поддерживаться, если возвращается ошибка, как это происходит, если
ch
недопустимая последовательность в текущей локали (это действительная последовательность в чешской локали): - Если ошибка указывает, что
ch
не является допустимой последовательностью, то они поддерживаются . - Если возвращаемая ошибка состоит в том, что разделитель / токен
[.
и / или .]
недопустим / не поддерживается, то последовательности упорядочения не поддерживаются. - Если ошибка неоднозначнаили для гарантированного способа проверки поддержки необходимо переключиться на чешский языковой стандарт (и подтвердить, что
ch
действительно допустимая последовательность сопоставления) или переключиться на любой другой языковой стандарт, в котором имеется хотя бы одна определенная последовательность сопоставления, которая может бытьиспользуется вместо ch
.
¹ Я не являюсь ни Яном Гойваэртом, ни каким-либо образом не связанным с сайтом Regular-Expressions.info.
² И я не CMCDragonkai.