没有被字母数字字符包围的单词的正则表达式

3
我需要一个匹配特定单词的正则表达式,该单词不被任何字母数字字符包围。我的想法是在之前和之后都加上否定符号:
[^a-zA-Z\d]myspecificword[^a-zA-Z\d]

因此它将匹配:

myspecificword
_myspecificword_
-myspecificword

不匹配:

notmyspecificword
myspecificword123

但是这个简单的正则表达式只有在它前面有一个空格的情况下才能匹配该单词:
myspecificword   // no match
 myspecificword  // match

使用标志“gmi”并使用JavaScript测试。我做错了什么?难道不应该简单吗?

https://regex101.com/r/BCkbVQ/3


1
正则表达式的单词边界是\b - user47589
@Amy 这样做不行,因为下划线被认为是一个单词字符。 - Barmar
使用负向先行断言。https://www.regular-expressions.info/lookaround.html - Barmar
3
因为 [^a-zA-Z\d] 需要匹配一个实际的字符,所以它无法起作用。开头或结尾处没有字符。 - Barmar
/(?<![a-z\d])myspecificword(?![a-z\d])/ig 应该可以工作,但请注意旧版浏览器不支持后顾。 - anubhava
5个回答

3

尝试使用:

(?<![^\s_-])myspecificword(?![^\s_-])

这段代码意味着匹配 myspecificword,并且该单词被包围在输入的开头/结尾、空格、下划线或破折号中。

演示


正向和反向查找是不必要的昂贵操作,最好使用行的开头和结尾。 - Akxe
@Akxe 这完全不正确,而且我的答案比你的答案更有效率。 - Tim Biegeleisen
1
我喜欢双重否定。但是由于OP说,“不被字母数字字符包围”,那么假定(myspecifword) 是可以接受的。所以为什么不这样写:(?<![^_\W])myspecificword(?![^_\W]) - Booboo
1
@GRoutar,请查看Barmar在18分钟前发布的对您问题的评论。 - Booboo
1
@GRoutar,你的模式存在问题,它不允许匹配以输入开头和/或结尾为边界的内容。 - Tim Biegeleisen
显示剩余5条评论

2

所需的不是空格,而是匹配 [^a-zA-Z\d] 的任何符号。

你应该使用:(演示)

(?:^|[^a-zA-Z\d])myspecificword(?:[^a-zA-Z\d]|$)

主要优点是支持所有正则表达式解析器。

据我所知,正向预查比交替更有效率。 - Tim Biegeleisen
@Akxe,解释一下为什么这个方法能够运行会提升你的回答质量。 - Jithin Pavithran
1
@JithinPavithran 最好的解释将会给你 https://regexr.com/,链接在“explain”选项卡中的答案里。这是一个交互式的正则表达式解释。 - Akxe

1
如果你真正的意思是“不被字母数字包围,除了_”(在你尝试的正则表达式中似乎愿意匹配任何不是字母或数字的东西),那么以下任何一种都应该是可接受的:
'myspecificword'
'_myspecificword_'
' myspecificword '
'-myspecificword-'
'(myspecificword)'

正则表达式应该是:

(?<![^_\W])myspecificword(?![^_\W])

let tests = ['myspecificword',
             '_myspecificword_',
             ' myspecificword ', 
             '-myspecificword-', 
             '(myspecificword)', 
             'amyspecificword',
             '1myspecificword'
             ];
let regex = /(?<![^_\W])myspecificword(?![^_\W])/;
for (let test of tests) {
    console.log(regex.test(test));
}

“被采纳”的答案将不匹配(我的特定单词),例如。”

0

这个问题的标题是:

正则表达式:匹配未被阿拉伯数字或字母包围的单词

其他答案都回答了一个不同的问题(也许是本意):

正则表达式:匹配既不以数字或字母开头又不以数字或字母结尾的单词

我将分别称这两种情况为 #1 和 #2。

如果指定的单词是 'cat',字符串是 '9cat',那么在该字符串中,'cat' 并不被数字或字母所包围,所以与 #1 相匹配但与 #2 不匹配。

对于 #1,可以使用以下正则表达式:

/cat(?!\p{Alpha}|(?<!\p{Alnum})cat/

"

匹配不跟随Unicode字母数字字符的'cat'或不在Unicode字母数字字符之前的'cat',但测试否定更容易:

"
/(?<=\p{Alpha}cat(?<=\p{Alnum})/

如果字符串不符合该正则表达式,则测试通过。

根据解释 #2,正则表达式为:

/(?<!\p{Alpha}cat(?!\p{Alnum})/

-1
我认为这个会起作用:
/ [^a-z0-9] ?myspesificword [^a-z0-9] ?/i

你的正则表达式使用了 [^a-zA-Z0-9],这意味着必须被非字母数字字符包围,加上 ? 就可以变成可选的。 - Illya
但这也会匹配周围带有字母数字字符的单词,例如 amyspesificwordz - Scott Sauyet
尝试使用 /([^a-z0-9]?myspesificword[^a-z0-9]?)/i - Illya
1
@Illya:我认为你可能需要再读一遍问题。这是在寻找能够匹配诸如“myspecificword”、“_myspecificword_”或“-myspecificword”的字符串,而不会匹配诸如“notmyspecificword”或“myspecificword123”的字符串。 - Scott Sauyet
像这样吗?/^([^a-z0-9]*myspesificword[^a-z0-9]*)$/i - Illya
糟糕,我的错,我想它会在长文本中匹配到我的特定单词。 - Illya

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