Os elementos de agrupamento geralmente são referenciados no contexto da classificação.
Em muitos idiomas, a ordenação (como em um dicionário) não é feita apenas por caractere. Por exemplo, em tcheco, ch
não classifica entre cg
e ci
como faria em inglês, mas é considerado um todo para classificação. É um elemento de classificação (não podemos nos referir a um caractere aqui, o caractere é um subconjunto de elementos de classificação) que classifica entre h
e i
.
Agora você pode perguntar: O que isso tem a ver com expressões regulares? , Por que eu gostaria de me referir a um elemento de intercalação em uma expressão entre colchetes? .
Bem, dentro das expressões entre colchetes, usamos ordem. Por exemplo [c-j]
, em , você deseja que os caracteres entre c
e j
. Bem e você? Você prefere agrupar elementos lá. [h-i]
em uma localidade tcheca corresponde ch
:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho
Portanto, se você conseguir listar um intervalo de elementos de intercalação em uma expressão entre colchetes, esperaria poder listá-los individualmente também. [a-cch]
corresponderia aos elementos de intercalação entre a
e c
e os caracteres c
e h
. Para ter a-c
e o ch
elemento de agrupamento, precisamos de uma nova sintaxe:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho
(aqueles em entre a
e c
e a ch
um).
Agora, o mundo ainda não é perfeito e provavelmente nunca será. O exemplo acima estava em um sistema GNU e funcionou. Outro exemplo de um elemento de intercalação pode ser e
com um sotaque agudo combinado em UTF-8 ( $'e\u0301'
renderizado $'\u00e9'
como é
).
é e é o mesmo caractere, exceto que um é representado com um caractere e o outro com dois.
$ echo $'e\u301t\ue9' | grep '^[d-f]t'
Funcionará corretamente em alguns sistemas, mas não em outros (não no GNU, por exemplo). E não está claro se $'[[.\ue9.]]'
deve corresponder apenas $'\ue9'
ou ambos $'\ue9'
e $'e\u301'
.
Sem mencionar scripts não alfabéticos, ou scripts com diferentes ordens de classificação regionais, coisas como ffi ( ffi
em um caractere) que se tornam difíceis de lidar com uma API tão simples.
ch
é na verdade dois personagens diferentes; é apenas tratado como um para fins de classificação. Tem certeza de que "digraph" é um termo aplicável?