Локальный контекст в регулярных выражениях
Проблема
Требуется преобразовать регистр в другом локальном контексте или заставить метасимвол \w совпадать
с символами национальных алфавитов.
Предположим, у вас имеется полгигабайта текста на немецком языке, для которого необходимо
составить предметный указатель. Вы хотите извлекать слова (с помощью \w+) и преобразовывать их в
нижний регистр (с помощью lс или \L). Однако обычные версии \w и lс не находят слова немецкого языка
и не изменяют регистр символов с диакритическими знаками.
Решение
Регулярные выражения и функции обработки текста Perl имеют доступ к локальному контексту POSIX.
Если включить в программу директиву
use
locale, Perl позаботится о символах национальных алфавитов —
конечно, при наличии разумной спецификации LC_CTYPE и системной поддержки.
use locale;
Комментарий
По умолчанию \w+ и функции преобразования регистра работают с буквами верхнего и нижнего регистров,
цифрами и подчеркиваниями. Преобразуются лишь простейшие английские слова, и даже в очень
распространенных заимствованных словах происходят сбои. Директива use locale помогает справиться с затруднениями.
Пример показывает, чем отличаются выходные данные для английского (en) и немецкого (de) локальных контекстов.
use locale;
use POSIX 'locale_h';
$name = "andreas k\xF6nig";
@locale{qw(German English)} = qw(de_DE.ISO_8859-1 us-ascii);
setlocale(LC_CTYPE, $locale{English})
or die "Invalid locale $locale{English}";
@english_names = ();
while ($name =~ /\b(\w+)\b/g) {
push(@english_names, ucfirst($1));
}
setlocale(LC_CTYPE, $locale{German})
or die "Invalid locale $locale{German}";
@german_names = ();
while ($name =~ /\b(\w+)\b/g) {
push(@german_names, ucfirst($1));
}
print "English names: @english_names\n";
print "German names: @gennan_names\n";
Решение основано на поддержке локальных контекстов в POSIX. Ваша система может обладать,
а может и не обладать такой поддержкой. Но даже если система заявляет о поддержке локальных
контекстов POSIX, в стандарте не определены имена локальных контекстов. Разумеется, переносимость
такого решения не гарантирована.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|