Что соответствует выражению \ X внутри RegEx? - PullRequest
9 голосов
/ 29 марта 2012

По данным http://www.regular -expressions.info ,

Вы можете считать \X версией Unicode точки в движках регулярных выражений, которые используют простой ASCII.

Означает ли это, что он будет соответствовать любому возможному Unicode кодовой точке?

Ответы [ 2 ]

8 голосов
/ 29 марта 2012

Описание сайта довольно хорошее:

\ X Соответствует одной графической единице Unicode, независимо от того, закодирована ли она как одна кодовая точка или несколько кодовых точек с использованием комбинированных меток.Графема наиболее близко напоминает повседневную концепцию «персонажа».\ X соответствует à, закодированному как U + 0061 U + 0300, à закодированному как U + 00E0, © и т. Д.

Итак, единственное, что делает его Unicode-ориентированным, это то, что он может соответствовать несколько кодовых точек , когда они объединяются в одну видимую «вещь» (графему).

См. Страница Википедии по объединению символов для более подробной информации, она перечисляет кодовую точку U + 0300упомянутый выше, например.

3 голосов
/ 29 марта 2012

С Руководство по Perl regex :

Это соответствует Unicode расширенный кластер графем .

\X соответствует вполне хорошо, что нормальное (не Unicode-программист) использование будет рассматривать один символ В качестве примера рассмотрим G с каким-то диакритический знак, такой как стрелка. Там нет такого единственного символа в Unicode, но можно составить с помощью G, за которым следует Unicode «КОМБИНИРОВАНИЕ ВВЕРХ СТРЕЛКАМИ НИЖЕ», и будет отображаться Unicode-осведомленное программное обеспечение, как если бы оно было одним символом.

Мнемоника: расширенный символ Unicode.

И из Справочные страницы PCRE (2012):

PCRE реализует более простую версию \ X, чем Perl, которая была изменена, чтобы сделать \ X совпадающим с тем, что Unicode называет «расширенным кластером графем». Это сложнее, чем расширенная последовательность Unicode, которая что соответствует PCRE.

[...]

\ X расширенная последовательность Unicode

[...]

Экранирование \ X соответствует любому количеству символов Юникода, которые образуют расширенную последовательность Юникода. \ X эквивалентно

(?>\PM\pM*)

То есть он соответствует символу без свойства "mark", за которым следует ноль или более символов со свойством mark, и рассматривает последовательность как атомную группу (см. ниже). Персонажи с свойство "mark" - это, как правило, акценты, которые влияют на предыдущий персонаж. Ни у одного из них нет кодовых точек меньше 256, поэтому в 8-битный режим без UTF-8 \ X соответствует любому одному символу.

Обратите внимание, что последние версии Perl изменили \ X, чтобы соответствовать тому, что Unicode вызывает «расширенный кластер графем», который имеет более сложное определение.

Более поздняя версия Справочных страниц PCRE (2015):

Расширенные кластеры графем

Экран \X соответствует любому количеству символов Юникода, которые образуют «расширенный кластер графем», и рассматривает последовательность как атомарный группа (см. ниже). До версии 8.31 включительно, соответствие PCRE более раннее, более простое определение, которое было эквивалентно

(?>\PM\pM*)

То есть он соответствует символу без свойства "mark", за которым следует ноль или более символов со свойством mark. Символы со свойством mark обычно не являются пробелами акценты, влияющие на предыдущий символ.

Это простое определение было расширено в Юникоде, чтобы включить больше сложные виды сложного характера, давая каждому персонажу нарушая графические свойства, и создавая правила, которые используют эти свойства для определения границ расширенной графемы кластеры. В выпусках PCRE более поздних, чем 8.31, \X соответствует одному из эти кластеры.

\X всегда соответствует хотя бы одному символу. Затем он решает, стоит ли добавить дополнительные символы в соответствии со следующими правилами для окончание кластера:

  1. Конец в конце строки темы.

  2. Не заканчивается между CR и LF; в противном случае завершается после любого управляющего символа.

  3. Не нарушайте последовательности слогов хангыль (корейский сценарий). Знаки хангыль бывают пяти типов: L, V, T, LV и LVT. Л за символом может следовать символ L, V, LV или LVT; LV или Символ V может сопровождаться символом V или T; LVT или T за символом может следовать только символ T.

  4. Не заканчивайте перед расширением символов или пробелами. Символы со свойством mark всегда имеют расширение свойство разрушения графемы.

  5. Не заканчиваться после символов препинания.

  6. В противном случае завершите кластер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...