Строка слова регулярного выражения, исключая дефис

Мне нужно регулярное выражение, которое соответствует выражению, заканчивающемуся границей слова, но которое не рассматривает дефис как границу. т.е. получить все выражения, соответствующие

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*