2016-11-25 24 views
0

regcomp (from glibc) - это функция POSIX для компиляции регулярных выражений.Что представляет собой один символ для regcomp? Какое многобайтное кодирование действительно определяет это?

 int regcomp(regex_t *restrict preg, const char *restrict pattern, 
    int cflags); 

Есть некоторые конструкции в регулярных выражениях, которые зависят от идеи одного символа, например [abc].

Если используется многобайтовая кодировка, и в выражении используется многобайтовая буква, интерпретация будет отличаться, если она рассматривается как последовательность байтов или последовательность многобайтовых букв.

Здесь я проиллюстрировать эту идею с grep (которые не должны быть одинаковыми в этом отношении, как функции C regcomp):

$ { echo Г; echo Д; } | egrep '[Д]' 
Д 
$ { echo Г; echo Д; } | LANG=C egrep '[Д]' 
Г 
Д 
$ 

LANG является значением по умолчанию, если какой-либо из конкретных переменных локали не установлены , так что вопрос: какой из них повлияет на идею regcomp о кодировании.

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

ответ

0

Что касается grep (которые не должны иметь такое же поведение, как regcomp), кажется, в честь LC_CTYPE этого решения:

$ { 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 '[Д]' 
Г 
Д 
$