36

我需要一个匹配以单词边界结尾的表达式的正则表达式,但它不将连字符视为边界。即获取匹配的所有表达式

type ([a-z])\b

但不匹配,例如

type a-1

换种说法:我想要一个等效的单词边界运算符 \b ,而不是使用单词 character class [A-Za-z0-9_],而是使用扩展类:[A-Za-z0-9_-]

4

2 回答 2

35

您可以为此使用前瞻,最短的方法是使用负前瞻:

type ([a-z])(?![\w-])

(?![\w-])意味着“如果下一个字符在\w或是”,则匹配失败-

这是一个使用正常前瞻的选项:

type ([a-z])(?=[^\w-]|$)

您可以阅读(?=[^\w-]|$)为“仅当下一个字符不在字符类中时才匹配[\w-],或者这是字符串的结尾”。

看到它工作:http ://www.rubular.com/r/NHYhv72znm

于 2012-04-17T18:03:06.110 回答
14

我有一个非常相似的问题,只是我不想将“*”视为边界字符。这是我所做的:

\b(?<!\*)([^\s\*]+)\b(?!*)

基本上,如果您处于单词边界,请回看一个字符,如果前一个字符是“*”,则不匹配。如果你在中间,不要在空格或星号上匹配。如果您在末尾,请确保末尾不是星号。在你的情况下,我认为你可以使用 \w 而不是 \s。对我来说,这适用于以下情况:

*word
wo*rd
word*
于 2014-08-28T01:52:34.687 回答