单词边界的正则表达式,但如果前面或后面有特殊字符,则仍然匹配

问题描述 投票:0回答:1

我想要完成的是匹配任何单词,即使它们后面或前面是非字母数字字符。

因此,例如对于以下字符串

This string contains word1 and word2* and anotherword1
,我希望获得
word1
word2
的两个匹配项,但不是
anotherword1
中的
word1
anotherword1

我现在拥有的是

\b(word1|word2)\b

但这与

word2
不匹配(忽略 *)。

根据我读到的内容

\b
仅匹配字母数字字符和非字母数字字符,但我不知道如何处理尾随我的目标单词的特殊字符。

LE:我认为

(?i)(?<=^|[^a-zA-Z0-9])(word1|word2)(?=$|[^a-zA-Z0-9])
可以解决这个问题……但是看起来还可以吗?这是一个更简单的方法吗?

regex
1个回答
2
投票

您正在寻找自适应单词边界(是的,这是我在here描述的概念):

(?!\B\w)(word1|word2)(?!\B\w)

或者,如果您只是想确保两端都没有单词字符:

(?<!\w)(word1|word2)(?!\w)

(?<!\w)
(?!\w)
环视是明确前导 (
(?<!\w)
) 和尾随 (
(?!\w)
) 字边界。

\b
的构造含义取决于上下文:
\bw
将匹配
w
中的
*w
,因为它需要在
\b
之前有一个非单词字符,但
\b\*
需要在
之前有一个单词字符*
因为
*
是非单词字符。

在不支持lookbehinds的语言中,应将

(?<!\w)
替换为
(^|\W)
,并应在代码中进行进一步的操作。

© www.soinside.com 2019 - 2024. All rights reserved.