Я могу предложить некоторую информацию, но трудно сказать, будет ли мой ответ «полезным».Во-первых, я только говорю и читаю по-английски, поэтому я явно не говорю и не читаю по-китайски.Я действительно являюсь автором RegexKitLite , который является оболочкой Objective-C для движка регулярных выражений ICU.Очевидно, это не perl
,:).
Несмотря на это, в движке регулярных выражений ICU есть функция, которая поразительно похожа на то, что вы пытаетесь сделать.В частности, механизм регулярных выражений ICU содержит опцию модификатора UREGEX_UWORD
, которую можно динамически включать с помощью обычного синтаксиса (?w:...)
.Этот модификатор выполняет следующее действие:
Управляет поведением \ b в шаблоне.Если установлено, границы слова находятся в соответствии с определениями слова, найденными в Unicode UAX 29, «Текстовые границы».По умолчанию границы слова идентифицируются с помощью простой классификации символов как «слово» или «не слово», что приблизительно соответствует традиционному поведению регулярного выражения.Результаты, полученные с помощью двух опций, могут сильно отличаться в серии пробелов и других несловарных символов.
Вы можете использовать это в регулярном выражении, например (?w:\b(.*?)\b)
, чтобы «извлечь» слова из строки,В движке регулярных выражений ICU он имеет довольно мощный «механизм разбиения по словам», который специально разработан для поиска разрывов слов в письменных языках, которые не имеют явного пробела «символ», такого как английский.Опять же, я не читаю и не пишу на этих языках, и я понимаю, что «это что-то вроде этого».В механизме прерывания слова ICU используется эвристика, а иногда и словари, чтобы найти разрывы слова.Насколько я понимаю, тайский язык - это особенно сложный случай.Фактически, я использую ฉันกินข้าว
(по-тайски «я ем рис», или мне так сказали) с регулярным выражением (?w)\b\s*
для выполнения операции split
над строкой для извлечения слов.Без (?w)
вы не можете разбить на разрывы слов.С (?w)
это приводит к словам ฉัน
, กิน
и ข้าว
.
Если приведенное выше «звучит как проблема, с которой вы столкнулись», то это может быть причиной.Если это так, то я не знаю ни одного способа сделать это в perl
, но я бы не считал это мнение авторитетным ответом, так как я использую механизм регулярных выражений ICU чаще, чем perl
, и яявно не правильно мотивированы, чтобы найти работающее perl
решение, когда оно у меня уже есть :).Надеюсь, это поможет.