Поддерживают ли регулярные выражения Java упорядоченные последовательности? - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь использовать регулярное выражение ([[.ch.]]*)c для тестовой строки chchch.Согласно спецификация :

[[. Ch.]] * C соответствует символу с первого по пятый в строке chchch

Когда япротестируйте его на Java, он действительно соответствует этим символам, но так же [[ch]]*c.Таким образом, я не уверен, соблюдается ли символ сортировки.Это так?

1 Ответ

0 голосов
/ 21 октября 2018

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.

...