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

Файловым системам при форматировании присваивается случайный номер для их уникальной идентификации. Раньше вам приходилось настраивать загрузчик и / etc / fstab, чтобы определить, какие файловые системы должны быть смонтированы, где используется узел dev, который состоит из произвольно назначенного идентификатора, такого как / dev / sda, и номера раздела. Проблема заключалась в том, что при изменении номеров разделов все существующие ссылки ломались. По-настоящему большая проблема возникла, когда произвольные идентификаторы самих дисков начали довольно часто меняться. С дисками IDE их могло быть только 4, и поэтому в зависимости от того, к какому физическому порту был подключен диск, это будет определять, был ли это / dev / hda или / dev / hdb. Однако для дисков SCSI, дисков SATA или систем с несколькими контроллерами дисков идентификатор просто назначается в том порядке, в котором они обнаруживаются, и этот порядок является несколько случайным и может меняться от одной загрузки к другой, даже если вы не Не делайте ничего вроде (отключайте) USB-диск. По мере того, как такие системы стали популярными, стало важно не полагаться на имена узлов разработки, и поэтому системы переключились на использование UUID для определения того, какая файловая система должна быть смонтирована, и какой узел разработки, который он может показывать при данной загрузке, не неважно.

11
12.01.2016, 11:36
2 ответа

Элементы колляции обычно упоминаются в контексте сортировки.

Во многих языках колляция (сортировка, как в словаре) производится не только по символам. Например, в чешском языке 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 и работал. Другим примером элемента collating element может быть e с сочетающимся острым ударением в UTF-8 ($'e\u0301' рендерится как $'\u00e9' как é).

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

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

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

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

7
27.01.2020, 19:59

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

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

.

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

1
27.01.2020, 19:59

Теги

Похожие вопросы