Gli elementi di fascicolazione sono generalmente indicati nel contesto dell'ordinamento.
In molte lingue, le regole di confronto (ordinamento come in un dizionario) non vengono eseguite solo per carattere. Ad esempio, in ceco, ch
non ordina tra cg
e ci
come se fosse in inglese, ma è considerato come un tutto per l'ordinamento. È un elemento di confronto (qui non possiamo fare riferimento a un personaggio, il personaggio è un sottoinsieme di elementi di confronto) che si divide tra h
e i
.
Ora potresti chiedere: cosa c'entra questo con le espressioni regolari? , Perché dovrei voler fare riferimento a un elemento di confronto in un'espressione di parentesi? .
Bene, all'interno delle espressioni tra parentesi, si usa l'ordine. Ad esempio in [c-j]
, vuoi i caratteri tra c
e j
. Bene, vero? Preferiresti raccogliere elementi lì. [h-i]
in una locale ceca corrisponde ch
:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho
Quindi, se sei in grado di elencare una serie di elementi di fascicolazione in un'espressione di parentesi, ti aspetteresti di essere in grado di elencarli anche singolarmente. [a-cch]
corrisponderebbe agli elementi di confronto tra a
e c
e i caratteri c
e h
. Per avere a-c
e l' ch
elemento di confronto, abbiamo bisogno di una nuova sintassi:
$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho
(quelli tra a
e c
e ch
quello).
Ora, il mondo non è ancora perfetto e probabilmente non lo sarà mai. L'esempio sopra era su un sistema GNU e ha funzionato. Un altro esempio di un elemento di confronto potrebbe essere e
con un accento acuto combinato in UTF-8 ( $'e\u0301'
reso simile $'\u00e9'
a é
).
é ed é hanno lo stesso personaggio, tranne per il fatto che uno è rappresentato con un personaggio e l'altro con due.
$ echo $'e\u301t\ue9' | grep '^[d-f]t'
Funzionerà correttamente su alcuni sistemi ma non su altri (non quelli GNU per esempio). E non è chiaro se $'[[.\ue9.]]'
debba corrispondere solo $'\ue9'
o entrambi $'\ue9'
e $'e\u301'
.
Per non parlare degli script non alfabetici, o degli script con differenti, regionali, ordinamenti, cose come ffi ( ffi
in un carattere) che diventano difficili da gestire con un'API così semplice.
ch
è in realtà due diversi personaggi; è solo trattato come uno ai fini dell'ordinamento. Sei sicuro che "digraph" è un termine applicabile?