Що означає [[.ch.]] У регулярній виразці?


11

Альтернативна назва: Що таке "згортання послідовності" або "збірний елемент" у регулярному виразі, сумісному з POSIX?

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

Я гуляв по Інтернету за прикладами та поясненнями і прийшов не зовсім з порожніми руками, але точно не просвітлений .

Єдине, що я начебто отримав - це те, що за певних обставин ви можете змусити ваш регулярний вигляд ставитись до декількох символів так, ніби вони були єдиним символом для порівняння довжини та визначення того, що таке "найдовша відповідність" (оскільки регулярні вирази жадібні і повернути найдовший можливий збіг).

Це все-таки? У мене виникають проблеми з використанням цього, але я підозрюю, що моє розуміння неповне. Що насправді "збігає" для регулярного виразу? І як [[.ch.]]ставиться до цього приклад у специфікаціях POSIX?

Відповіді:


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'як é).

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

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

Працюватиме належним чином у деяких системах, але не в інших (наприклад, у GNU). І незрозуміло, чи $'[[.\ue9.]]'слід відповідати тільки $'\ue9'або обом $'\ue9'і $'e\u301'.

Не кажучи вже про не алфавітні сценарії чи сценарії з різними, регіональними порядками сортування, такі речі, як ffiin ( в одному символі), з якими стає складним обробляти такий простий API.


1

Це корисно, коли використовуються символи, які не є англійськими (не-ascii). Приклад, який chви згадуєте, - це диграф , тобто деякі мови мають букву в своєму алфавіті, яка / може бути представлена ​​двома літерами англійського алфавіту.

Коли ви використовуєте [.ch.]в регулярному вираженні, ви в основному говорите: "Я очікую, що не англійська послідовність введення з диграфом ch. Я хочу, щоб мій regexp збігався з одним charachter ch. Моя програма програмування / движок regex / клавіатура не дозволяє мені писати цей диграф підписую, тому я ввожу. [.ch.]Я не маю на увазі, cа за ним слід h. Будь-ласка, знайдіть випадки виникнення диграфа як окремого характера ".

[[.ch.]]означає, що диграф є частиною набору символів. У цьому випадку насправді лише один персонаж. Просто стандартне позначення регулярного виразу.


Від відповіді Stephane в це виглядає як ch це на самому справі два різних персонажа; це просто трактується як один з метою сортування. Ви впевнені, що "digraph" - це застосовний термін?
Wildcard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.