Граница регулярных выражений для многобайтовых строк - PullRequest
3 голосов
/ 10 марта 2009

Я использую библиотеку регулярных выражений posix c (regcomp / regexec) в моем поисковом приложении. Мое приложение поддерживает разные языки, в том числе те, которые используют многобайтовые символы. Я столкнулся с проблемой при использовании метасимвола границы слова (\ b). Для однобайтовых строк он работает просто отлично, например:

"\ bpaper \ b" соответствует "бумаге"

Однако, если строки регулярного выражения и запроса являются многобайтовыми, кажется, что они работают неправильно, например:

"\ b 紙張 \ b" не соответствует "紙張"

Я что-то упустил? Любая помощь будет принята с благодарностью.

Запрошенная информация:

  • Язык программирования: C
  • Библиотека регулярных выражений: GNU C (regex.h)

Спасибо.

Ответы [ 3 ]

6 голосов
/ 10 марта 2009

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

Что такое «многобайтовый» в этом контексте? Строка, закодированная в байтах UTF-8? Специфичная для локали многобайтовая кодировка, например, GB?

Если вы не имеете дело с широкими (Unicode) строками изначально, вы не можете ожидать большей поддержки не-ASCII-символов, чем просто обнаружение их присутствия. Регулярное выражение POSIX не определяет какие-либо классы символов для байтов вне диапазона ASCII, поэтому оно не знает, что любой из байтов в "\ xe7 \ xb4 \ x99" (представление UTF-8 '紙') может рассматриваться слова-буквы; следовательно, он не видит границ слов.

Что представляет собой буква или слово в Юникоде, является более сложным вопросом, чем простое регулярное выражение ASCII. (И очевидно, что слово «по-китайски» является спорным само по себе.) Если все, что вы хотите обнаружить, это просто старые пробелы, вы можете сделать это явно:

(\s|^)紙張(\s|$)
0 голосов
/ 18 ноября 2010

См. этот ответ для получения дополнительной информации о Unicode и границах слов. Указанные решения применимы к библиотеке PCRE, но принципы должны быть применимы и к другим.

0 голосов
/ 10 марта 2009

Я думаю, что это зависит от используемой вами библиотеки / языка программирования и от конфигурации вашей библиотеки RegExp. Возможно, вам нужно включить многобайтовую поддержку, сообщить библиотеке, какую кодировку символов вы используете, или соответственно отредактировать настройки локали. Некоторые специальные операции, такие как \ b или \ w, зависят от этих настроек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...