不由字母数字字符包围的单词的Regex



我想要一个正则表达式来匹配一个不被任何字母数字字符包围的特定单词。我的想法是包括一个否定之前和之后:

[^a-zA-Zd]myspecificword[^a-zA-Zd]

所以它会匹配:

myspecificword
_myspecificword_
-myspecificword

不匹配:

notmyspecificword
myspecificword123

但是这个简单的正则表达式本身不会匹配单词,除非它前面有一个空格:

myspecificword   // no match
myspecificword  // match

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

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

尝试使用:

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

这意味着当myspecificword两侧被输入的开始/结束、空白、下划线或短划线包围时,要匹配它。

演示

需要的不是空白,而是任何与[^a-zA-Zd]匹配的符号。

你应该使用:(演示(

(?:^|[^a-zA-Zd])myspecificword(?:[^a-zA-Zd]|$)

主要好处是支持所有Regexp解析器。

如果你的意思是"不被_以外的字母数字包围(并且在你尝试的正则表达式中,你似乎愿意匹配任何不是字母或数字的东西(,那么以下任何一个都应该是可以接受的:

'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));
}

例如,"已接受"的答案将与(myspecificword)不匹配。

这个问题的标题是

Regex表示未被字母数字字符包围的单词

其他答案都解决了一个不同的问题(很可能就是预期的问题(:

单词的Regex前面和后面都没有字母数字字符

我将把这些语句分别称为#1和#2。

如果指定的单词是'cat',字符串是'9cat',则'cat'不会被字符串中的字母数字字符包围,因此与#1匹配,但与#2不匹配。

对于#1,可以使用regex:

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

("匹配不后跟Unicode字母数字字符的‘cat’或不后跟Unicode字符的‘cat’"(,尽管测试否定更容易:

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

如果字符串与此正则表达式不匹配,则测试通过。

对于解释#2,正则表达式为:

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

我认为这会起作用:

/[^a-z0-9]?myspesificword[^a-z0-9]?/i

最新更新