st
, pourrait être représenté par un 1-caractère stylistique ligature comme st
ou ſt
, de sorte que sa longueur peut être de 2 ou 1.
Trouver rapidement perl liste complète des 2→1-caractère ligatures à l'aide d'une commande bash:
$ perl -e 'print $^V'
v5.26.2
$ for lig in {a..z}{a..z}; do \
perl -e 'print if /(?<!'$lig')x/i' 2>/dev/null || echo $lig; done
ff fi fl ss st
Ces représentent respectivement l' ff
, fi
, fl
, ß
, et st
/ſt
des ligatures.
(ſt
représente ſt
, à l'aide de l'obsolètes longue s de caractères; il correspond st
et il n'a pas de correspondance ft
.)
Perl prend également en charge le reste stylistique ligatures, ffi
et ffl
pour ffi
et ffl
, même si ce n'est pas de noter dans ce contexte depuis lookbehinds ont déjà des problèmes avec ff
et fi
/fl
séparément.
Les futures versions de perl peut inclure plus de stylistique ligatures, si tout ce qui reste sont des polices spécifiques (par exemple, Linux Libertine a stylistique des ligatures pour ct
et ch
) ou discutable de stylistique (tels que les hollandais ij
pour ij
ou obsolètes espagnol, ꝇ
pour ll
). Il ne semble pas approprié de ce traitement pour les ligatures qui ne sont pas totalement interchangeables (personne n'accepterait dœs
pour does
), bien qu'il existe d'autres scénarios, comme l'inclusion d' ß
grâce à ses majuscules être SS
.
Perl 5.16.3 (et de même les anciennes versions) seulement tomber sur ss
(pour ß
) et ne parviennent pas à développer les autres ligatures lookbehinds (ils ont une largeur fixe et ne correspondent pas). Je n'ai pas chercher la correction de détailler exactement qui sont concernés.
Perl 5.14 introduit ligature de soutien, de sorte que les versions antérieures n'ont pas ce problème.
Solutions de contournement
Des solutions de contournement pour /(?<!August)x/i
(seul le premier sera correctement éviter August
):
-
/(?<!Augus[t])(?<!Augu(?=st).)x/i
(absolument complet)
-
/(?<!Augu(?aa:st))x/i
(juste l' st
dans le lookbehind est "ASCII-safe" 2)
-
/(?<!(?aa)August)x/i
(de l'ensemble de l'lookbehind est "ASCII-safe" 2)
-
/(?<!August)x/iaa
(l'ensemble de la regex est "ASCII-safe" 2)
-
/(?<!Augus[t])x/i
(pauses ligature recherche 1)
-
/(?<!Augus.)x/i
(légèrement différentes, correspond plus)
-
/(?<!Augu(?-i:st))x/i
(sensible à la casse st
dans lookbehind, de ne pas correspondre AugusTx
)
Ces jouets avec la suppression de la casse modificateur de1 ou de l'ajout de l' ASCII-safe modificateur2 dans divers endroits, nécessitant souvent la regex écrivain à savoir notamment de la largeur variable de la ligature.
La première variante (qui est la seule complète) correspond à la variable largeurs avec deux lookbehinds: d'abord pour les six caractères de la version (pas de ligatures comme indiqué dans la première citation ci-dessous) et la seconde pour toutes les ligatures, le recours à une avant d'anticipation (qui a une largeur égale à zéro!) pour st
(y compris les ligatures), puis de rendre compte de son caractère unique de largeur avec un .
Deux segments de l' perlre
page de man:
1 casse modificateur /i
& ligatures
Il y a un certain nombre de caractères Unicode qui correspondent à une séquence de
plusieurs personnages en vertu de l' /i
. Par exemple, "minuscule LATINE LIGATURE
FI" doit correspondre à la séquence de fi
. Perl n'est pas actuellement en mesure de
effectuez cette opération lorsque plusieurs personnages sont dans le modèle et sont
partagé entre groupements, ou lorsqu'un ou plusieurs sont quantifiés. Ainsi
"\N{LATIN SMALL LIGATURE FI}" =~ /fi/i; # Matches [in perl 5.14+]
"\N{LATIN SMALL LIGATURE FI}" =~ /[fi][fi]/i; # Doesn't match!
"\N{LATIN SMALL LIGATURE FI}" =~ /fi*/i; # Doesn't match!
"\N{LATIN SMALL LIGATURE FI}" =~ /(f)(i)/i; # Doesn't match!
2 ASCII-safe modificateur /aa
(perl 5.14+)
D'interdire ASCII/non-ASCII correspond à (comme k
avec \N{KELVIN SIGN}
),
spécifiez l' a
deux fois, par exemple /aai
ou /aia
. (La première
l'apparition de l' a
limite l' \d
, etc., et la deuxième occurrence
ajoute l' /i
restrictions.) Mais, notez que les points de code en dehors de la
Plage ASCII utilise Unicode règles pour /i
correspondant, de sorte que le modificateur
n'est pas vraiment restreindre tout simplement ASCII; c'est tout simplement interdit l'
le brassage de l'ASCII et non-ASCII.
Pour résumer, cette option offre une protection pour les applications qui
ne souhaite pas être exposé à l'ensemble de l'Unicode. La spécification de deux fois donne
une protection supplémentaire.