2016-11-25 2 views
0

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= 
$ 

Répondre

0

Quant à grep (qui ne doit pas avoir le même comportement que regcomp), il semble honorer LC_CTYPE de cette décision:

$ { echo Г; echo Д; } | LANG=en_US.utf8 egrep '[Д]' 
Д 
$ { echo Г; echo Д; } | LANG=en_US.utf8 LC_COLLATE=C egrep '[Д]' 
Д 
$ { echo Г; echo Д; } | LANG=en_US.utf8 LC_CTYPE=C egrep '[Д]' 
Г 
Д 
$