Соответствие тире Unicode в регулярных выражениях Java?

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

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

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

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

никакой радости. Для входного сигнала образца ниже, черточка не обнаружена, и titleSegmentSeparator.matcher (sectionTitle).find () возвращает false!

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

образец ввод:

резюме исследования (1 из 10) – конкурс

S (83)t (116)u (117)d (100) y(121) (32)S(83)u (117) m (109)m (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)

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

1 ответов


вы смешиваете decimal (8211) и шестнадцатеричной (0x8211).

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

но почему бы просто не использовать свойство Unicode "Dash punctuation"?

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