Соответствие тире 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"