регулярное выражение, содержащее слова Unicode - PullRequest
7 голосов
/ 13 апреля 2011

Я хочу сопоставить все строки, содержащие определенное слово. как:

String regex = (?:\P{L}|\W|^)(ベスパ)(?:\b|$)

однако класс Pattern не компилирует его:

java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 39
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$)

Я уже установил unicode_case для компиляции параметров, не уверен, что здесь не так

final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE| Pattern.CANON_EQ);

Спасибо за помощь! :)

Ответы [ 4 ]

1 голос
/ 13 апреля 2011

Из приведенного сообщения об ошибке, которое совсем не похоже на показанное строковое регулярное выражение, я делаю вывод, что исходный шаблон был по существу следующим: я взял на себя смелость переформатировать, добавить символические константы и предвосхитить номера строк что мы могли бы проверить и решить его более легко.

(Все нетривиальные шаблоны должны всегда записываться в режиме (?x) - даже несмотря на то, что Java сражается против вас, вы все равно должны это делать.)

  1     (?: \P{L} | \W | ^ )
  2     (
  3         (?: \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU}
  4           | \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU}
  5           | \N{KATAKANA LETTER HE} \N{KATAKANA LETTER ZU}
  6         )
  7         (?: \N{KATAKANA LETTER PA} )
  8     |
  9             \N{KATAKANA LETTER PA}
 10     )
 11 |
 12             \N{KATAKANA LETTER HA}
 13     )
 14     \N{COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK}
 15     )
 16     (?: \b | $ )

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

Как теперь должно быть очевидно, синтаксическая проблема заключается в том, что закрывающие скобки в строках 13 и 15 являются ложными: у них нет соответствующих открытых скобок.

Несмотря на первые и последние строки, я все еще пытаюсь понять, что вы действительно пытаетесь сделать здесь. Почему дублирование строк 3 и 4? Это не делает ничего полезного. И я не вижу причин для группировки в строке 7.

Намерено ли разрешить использование знака комбинирования для какой-либо из предшествующих вещей?

Что касается ошибок в первой и последней строках, понимаю ли я, что простая граница слова - это все, что вы ищете? Вы действительно хотите включить эти граничные символы в свой матч или просто пытаетесь установить границы? Почему вы говорите не букву или не слово?

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

Если бы вы использовали что-то действительно совместимое с UTS # 18, это работало бы нормально, но, как я полагаю, вы этого не сделали (я не слышал упоминаний об отделении интенсивной терапии), мы должны будем исправить это так, как я иметь ранее изложенные .

Предварительный просмотр для неслова или начала строки будет работать для первого, а предварительный просмотр для неслова или конца строки будет работать для последнего. Это то, что \b, конечно, должен делать, когда сталкиваетесь с символами слова, как у вас здесь, и это может даже сработать, если вы будете держаться подальше от несловесной частицы.

Но пока я не увижу больше первоначального намерения, я не думаю, что должен сказать больше.

0 голосов
/ 02 июня 2015

Режим UNICODE_CHARACTER_CLASS также можно включить с помощью выражения встроенного флага (? U)

попробовать:

(?U)(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$)

Но сначала зафиксируй скобки, так как я не знаю, что ты хочешь входить или выходить из средней группы

0 голосов
/ 13 апреля 2011

Символы Юникода в регулярных выражениях - сложная задача .

Вот параграф из документации Pattern:

Поддержка Unicode

Этот класс следует Техническому отчету Unicode # 18: Руководства по регулярным выражениям Unicode, реализуя его второй уровень поддержки, хотя и с немного другим конкретным синтаксисом.

Выходные последовательности Unicode, такие как \u2014 в исходном коде Java, обрабатываются, как описано в п. 3.3 Спецификации языка Java. Такие escape-последовательности также реализуются непосредственно синтаксическим анализатором регулярных выражений, поэтому экранирование Unicode можно использовать в выражениях, которые читаются из файлов или с клавиатуры. Таким образом, строки "\u2014" и "\\u2014", хотя и не равны, компилируются в один и тот же шаблон , который соответствует символу с шестнадцатеричным значением 0x2014.

Таким образом, поскольку мы знаем:

  • = \u3049
  • = \u30B9
  • = \u30D1

правильный способ написать шаблон, который вы ищете:

String regex = "(?:\\P{L}|\\W|^)(\\u30d9\\u30B9\\u30D1)(?:\\b|$)";

Дополнительная литература :

0 голосов
/ 13 апреля 2011
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$)
(            )((              )(   )   )   )  )(      )

У шаблона в вашем сообщении об ошибке есть два дополнительных символа ')'

...