Я использую границу слова регулярного выражения \b и пытаюсь сопоставить слово в следующем предложении, но результат не тот, что мне нужен. Соединительные знаки препинания (например, подчеркивание) не считаются границей слова.
Предложение: ab﹎cd_de_gf|ij|kl|mn|op_
Регулярное выражение: \\bkl\\b
Однако de
не соответствует.
Я попытался обновить регулярное выражение, чтобы использовать пунктуацию соединителя Unicode (это требование продукта, поскольку мы также поддерживаем языки CJK), но это не работает.
Регулярное выражение: (?<=\\b|[\p{Pc}])de(?=\\b|[\p{Pc}])
Что мне здесь не хватает?
Примечание: кажется, что (?<=\\b|_)de(?=\\b|_)
работает для знаков подчеркивания, но мне нужно, чтобы регулярное выражение работало для всех знаков пунктуации соединителя.
Заранее спасибо !!
Для соответствия любым знакам пунктуации соединителя вам нужно \p{Pc}
:
(?<=\\b|\\p{Pc})de(?=\\b|\\p{Pc})
ПРИМЕЧАНИЕ. \p{Pc}
также может быть записано как [_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F]
, которое соответствует всем этим 10 символам.
О верно !! В моей первоначальной попытке я забыл экранировать \p{Pc}. Спасибо. Это сработало
На основе описанного вами варианта использования вы можете упростить регулярное выражение до:
(?<![[:alnum:]])de(?![[:alnum:]])
вместо того, чтобы пытаться сопоставить границы слов, символы пунктуации юникода и т. д.
Это будет соответствовать de
, если за ним не следует или не предшествует какой-либо буквенно-цифровой символ.
Попробуйте:
(?<![[:alnum:]])de(?![[:alnum:]])