正则表达式单词边界排除连字符

39
我需要一个正则表达式来匹配以单词边界结束的表达式,但是不将连字符视为边界。 即获取所有由此匹配的表达式。
type ([a-z])\b

但不匹配例如

type a-1

重新表述: 我想要一个等价于单词边界运算符\b的操作符,它不使用单词字符类[A-Za-z0-9_],而是使用扩展类:[A-Za-z0-9_-]


你正在使用哪个正则表达式引擎 -- 是 .NET、JavaScript 等? - Jay
2个回答

38
你可以使用正向预查来实现这个,其中最短的方法是使用负向预查:
type ([a-z])(?![\w-])

(?![\w-]) 的意思是 "如果下一个字符是 \w 或者 -,则匹配失败"。

这里有一个使用普通前瞻的选项:

type ([a-z])(?=[^\w-]|$)
你可以将(?=[^\w-]|$)理解为"只有在下一个字符属于字符类[\w-]或者这已经是字符串的结尾时,才进行匹配"。
查看它的工作原理:http://www.rubular.com/r/NHYhv72znm

如果您想匹配空格而不是单词的开头或结尾,您必须在美元符号周围添加括号,即([a-z])(?![\w-])|($|\s)。在我的情况下,我想在8位数字的开头和结尾排除连字符。正则表达式看起来像re.search(r"((?![-\w])|(\s|^))(\d{8})((?![-\w])|(\s|^))", "-12345678 ")。 - Eelco van Vliet

16

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

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

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

*word
wo*rd
word*

4
您的正则表达式语法无效。 - MaxZoom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接