Что [[.ch.]] Означает в регулярном выражении?

11

Альтернативное название: Что такое «последовательность упорядочения» или «элемент упорядочения» в регулярном выражении, совместимом с POSIX?

Я нашел точное техническое определение в разделе 9.3.5 спецификаций POSIX , как пункт № 4 в списке, но мне это не совсем понятно.

Я поискал в Интернете примеры и объяснения и пришел не совсем с пустыми руками, но определенно не просвещенным .

Единственное, что я получил, это то, что в определенных обстоятельствах вы можете заставить свое регулярное выражение обрабатывать несколько символов, как если бы они были единым символом для сравнения длины и определения того, что является «самым длинным соответствием» (поскольку регулярные выражения являются жадными и вернуть максимально возможное совпадение).

Это все, хотя? У меня проблемы с поиском использования, но я подозреваю, что мое понимание неполно. Что на самом деле "сопоставляет" для регулярного выражения? И как [[.ch.]], пример из спецификации POSIX, относится к этому?

Wildcard
источник

Ответы:

7

На элементы сортировки обычно ссылаются в контексте сортировки.

Во многих языках сопоставление (сортировка как в словаре) выполняется не только по символам. Например, на чешском языке, chне сортирует cgи не так, ciкак это было бы на английском языке, но считается в целом для сортировки. Это элемент сортировки (здесь мы не можем ссылаться на символ, символ - это подмножество элементов сортировки), который сортирует между hи i.

Теперь вы можете спросить: какое отношение это имеет к регулярным выражениям? , Почему я хотел бы сослаться на упорядочивающий элемент в выражении скобки? ,

Что ж, внутри скобочных выражений используется порядок. Например, в [c-j], вы хотите символы между cи j. Ну а ты? Вы бы предпочли собирать элементы там. [h-i]в чешской локали совпадает ch:

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho

Таким образом, если вы можете перечислить диапазон элементов сортировки в выражении в скобках, то вы можете ожидать, что сможете перечислить их по отдельности. [a-cch]будет сопоставлять элементы сортировки между aи cи cи hсимволов. Чтобы иметь a-cи chэлемент сортировки, нам нужен новый синтаксис:

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho

(те , между ними aи cи chодин).

Сейчас мир еще не совершенен и, вероятно, никогда не будет. Пример выше был в системе GNU и работал. Другим примером элемента сопоставления может быть eкомбинированный острый акцент в UTF-8 ( $'e\u0301'отображается как $'\u00e9'as é).

é и é - один и тот же символ, за исключением того, что один представлен одним символом, а другой - двумя.

$ echo $'e\u301t\ue9' | grep '^[d-f]t'

Будет работать должным образом в некоторых системах, но не в других (например, не в GNU). И неясно, $'[[.\ue9.]]'должны ли совпадать только $'\ue9'или оба $'\ue9'и $'e\u301'.

Не говоря уже о неалфавитных сценариях или сценариях с различными региональными порядками сортировки, такими как ffi ( ffiодним символом), которые становятся сложными для обработки с таким простым API.

Стефан Шазелас
источник
1

Это полезно, когда используются не английские (не ascii) символы. В качестве примера chвы упомянули диграф , то есть в некоторых языках в алфавите есть буква, которая / может быть представлена ​​двумя буквами в английском алфавите.

Когда вы используете [.ch.]в регулярном выражении, вы в основном говорите: «Я ожидаю, chчто вводная последовательность не на английском языке с орграфом . Я хочу, чтобы мое регулярное выражение совпадало с одним символом ch. Мой язык программирования / механизм / клавиатура регулярных выражений не позволяет мне писать этот орграф знак, поэтому я набираю. [.ch.]Я не имею в виду cпосле сопровождаемого h. Пожалуйста, найдите только вхождения орграфа в качестве одного символа. "

[[.ch.]]означает, что орграф является частью набора символов. В этом случае только один персонаж на самом деле. Просто стандартная запись регулярного выражения.

Рольф
источник
От ответа Stephane в это выглядит как ch это на самом деле два разных персонажа; это просто рассматривается как один для целей сортировки. Вы уверены, что «диграф» является применимым термином?
Подстановочный