Я пытаюсь обработать регулярное выражение Java для разделения строк общего формата "нечто - панель" в "нечто" и "панель" с помощью Pattern.split (). "-" символ может быть одним из нескольких тире: ASCII '-', длинное тире, короткое тире, и т.д. Я создал следующее регулярное выражение:
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!
Чтобы удостовериться, что я не пропускал необычной символьной сущности, я использовал System.out для печати некоторой отладочной информации. Вывод следующим образом - каждый символ сопровождается выводом (международного) символа, который должен быть unicode кодовой точкой it, нет?
Демонстрационный вход:
Изучите сводку (1 из 10) – конкуренция
S (83) т (116) u (117) d (100) год (121) (32) S (83) u (117) м (109) м (109) (97) r (114) год (121) (32) ((40) 1 (49) (32) o (111) f (102) (32) 1 (49) 0 (48)) (41) (32) – (8211) (32) C (67) o (111) м (109) p (112) e (101) т (116) я (105) т (116) я (105) o (111) n (110)
Это смотрит на меня как этот тире, кодовая точка 8211, который должен быть подобран regex, но это не! Что продолжается здесь?
Вы смешиваете десятичное ( 8211
) и шестнадцатеричное ( 0x8211
).
\ x
и \ u
оба ожидают шестнадцатеричное число, поэтому вам нужно будет использовать \ u2014
для соответствия длинному тире, а не \ u8211
(и \ x2D
для обычного дефиса и т. д.).
Но почему бы просто не использовать свойство Unicode «Пунктуация тире»?
В виде строки Java: "\\ s \\ p {Pd} \\ s"