Os elementos de agrupamento geralmente são referenciados no contexto da classificação.
Em muitos idiomas, o agrupamento (classificação como em um dicionário) não é feito apenas por caractere. Por exemplo, em tcheco, ch
não classifica entre cg
e ci
como seria em inglês, mas é considerado como um todo para classificação. É um elemento de agrupamento (não podemos nos referir a um caractere aqui, o caractere é um subconjunto de elementos de agrupamento) 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 agrupamento em uma expressão de colchetes? .
Bem, dentro de expressões de colchetes, uma usa a ordem. Por exemplo, em [c-j]
, você quer os caracteres entre c
e j
. Bem e você? Você prefere querer agrupar elementos lá. [h-i]
em uma localidade checa corresponde a ch
:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho
Portanto, se você conseguir listar vários elementos de agrupamento em uma expressão de colchetes, talvez espere poder listá-los individualmente também. [a-cch]
corresponderia aos elementos de agrupamento entre a
e c
e os caracteres c
e h
. Para ter o a-c
e o elemento de comparação ch
, precisamos de uma nova sintaxe:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho
(aqueles entre a
e c
e 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 collating poderia ser e
com uma combinação de acento agudo em UTF-8 ( $'e\u0301'
renderizado como $'\u00e9'
as é
).
é e é o mesmo caractere , exceto que um é representado por um caractere e o outro por 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 a $'\ue9'
ou ambos $'\ue9'
e $'e\u301'
.
Sem mencionar scripts não alfabéticos, ou scripts com ordens de classificação diferentes, regionais, coisas como ffi ( ffi
em um caractere) que se tornam complicadas de se lidar com uma API tão simples.