regcomp
(à partir de la glibc) est une fonction POSIX pour compiler des expressions régulières.Qu'est-ce qui constitue un caractère pour regcomp? Quel codage multi-octets détermine-t-il?
int regcomp(regex_t *restrict preg, const char *restrict pattern,
int cflags);
Il y a quelques constructions dans les expressions régulières qui dépendent de l'idée d'un seul caractère, par exemple [abc]
.
Si un codage multi-octets est utilisé et qu'une lettre multi-octets est utilisée dans l'expression, l'interprétation serait différente si elle était traitée comme une séquence d'octets ou une séquence de lettres multi-octets.
Ici, j'illustrer cette idée avec grep
(qui ne doit pas être le même à cet égard que la fonction C regcomp
):
$ { echo Г; echo Д; } | egrep '[Д]'
Д
$ { echo Г; echo Д; } | LANG=C egrep '[Д]'
Г
Д
$
LANG
est la valeur par défaut si l'une des variables de paramètres régionaux spécifiques ne sont pas définies , donc la question est: lequel d'entre eux affecterait l'idée de regcomp
sur l'encodage.
$ locale
LANG=ru_RU.utf8
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC="ru_RU.utf8"
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES=POSIX
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=
$