Соответствие штрихам Unicode в регулярных выражениях Java? - PullRequest
6 голосов
/ 15 июня 2010

Я пытаюсь создать регулярное выражение Java для разделения строк общего формата "foo - bar" на "foo" и "bar" с помощью Pattern.split ().Символ "-" может быть одним из нескольких тире: ASCII '-', em-тире, en-тире и т. Д. Я построил следующее регулярное выражение:

private static final Pattern titleSegmentSeparator = Pattern.compile("\\s(\\x45|\\u8211|\\u8212|\\u8213|\\u8214)\\s");

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

String[] sectionSegments = titleSegmentSeparator.split(sectionTitle);

Нет радости.В приведенном ниже примере ввода черта не обнаружена, и titleSegmentSeparator.matcher (sectionTitle) .find () возвращает false!

Чтобы убедиться, что я не пропустил какие-либо необычные символьные объекты, я использовал System.out, чтобы напечатать некоторую отладочную информацию.Вывод следующий: за каждым символом следует вывод (int) символа char, который должен быть его кодовой точкой Юникод, нет?

Пример ввода:

StudyРезюме (1 из 10) - Соревнования

S (83) т (116) у (117) д (100) у (121) (32) С (83) у (117) м (109) м(109) a (97) r (114) y (121) (32) ((40) 1 (49) (32) o (111) f (102) (32) 1 (49) 0 (48)) (41) (32) - (8211) (32) C (67) o (111) m (109) p (112) e (101) t (116) i (105) t (116) i (105) o (111) n (110)

Мне кажется, что тире - это кодовая точка 8211, которой должно соответствовать регулярное выражение, но это не так!Что здесь происходит?

1 Ответ

12 голосов
/ 15 июня 2010

Вы смешиваете десятичную (8211) и шестнадцатеричную (0x8211).

\x и \u ожидают шестнадцатеричное число, поэтому вам нужно будет использовать \u2014 для соответствия с тире, а не \u8211\x2D для обычного дефиса и т. Д..).

Но почему бы просто не использовать свойство Unicode "Пунктуация тире"?

Как строка Java: "\\s\\p{Pd}\\s"

...