Строка слова регулярного выражения, исключая дефис
Мне нужно регулярное выражение, которое соответствует выражению, заканчивающемуся границей слова, но которое не рассматривает дефис как границу.
т.е. получить все выражения, соответствующие
type ([a-z])\b
но не совпадают, например.
type a-1
перефразировать: мне нужен эквивалент оператора границы слова \b, который вместо использования символьного класса слов [A-Za-z0-9_] использует расширенный класс: [A-Za-z0-9_-]
Ответы
Ответ 1
Вы можете использовать для этого взгляд, самым коротким будет использование отрицательного вида:
type ([a-z])(?![\w-])
(?![\w-])
означает "сбой соответствия, если следующий символ находится в \w
или является -
".
Вот вариант, который использует обычный просмотр:
type ([a-z])(?=[^\w-]|$)
Вы можете читать (?=[^\w-]|$)
как "только в том случае, если следующий символ не в классе символов [\w-]
, или это конец строки".
Посмотрите, как работает: http://www.rubular.com/r/NHYhv72znm
Ответ 2
У меня была довольно похожая проблема, но я не хотел рассматривать символ "*" как пограничный. Вот что я сделал:
\b(?<!\*)[^\s\*]+)\b(?!*)
В принципе, если вы находитесь на границе слова, оглянитесь назад на один символ и не совпадите, если предыдущий символ был "*". Если вы находитесь посередине, не соглашайтесь на пробел или звездочку. Если вы в конце, убедитесь, что конец не является звездочкой. В вашем случае, я думаю, вы могли бы использовать \w вместо\s. Для меня это работало в следующих ситуациях:
*word
wo*rd
word*