我需要一个正则表达式在javascript中匹配以特殊字符开头或结尾的整个单词?
这应该很简单,但由于某种原因,?之后的\b并没有像我预期的那样运行:
> /FOO\?/.exec('FOO? ')
[ 'FOO?', index: 0, input: 'FOO? ', groups: undefined ]
> /FOO\?\b/.exec('FOO? ')
null我需要什么,比如我的单词是"FOO?“(包括问号),我想匹配:
"FOO?很酷“,”你觉得FOO吗?“
而不是:"FOO很酷“,”FOO?很酷“,”aaFOO?很酷“
它也应该适用于以"?“开头的单词。例如,如果我的单词是"?FOO",我想匹配:
"?FOO很酷“,”我爱?FOO“
而不是:"FOO很酷“,”FOO?很酷“,”aaFOO?很酷“
我希望这是有意义的。
发布于 2018-09-07 06:54:53
\b单词边界结构不明确。您需要使用明确的构造,以确保匹配的单词的左侧/右侧有非单词字符或字符串的开头/结尾。
您可以使用
/(?:^|\W)\?FOO\?(?!\w)/g在这里,(?:^|\W)是一个非捕获组,它匹配字符串的开头或任何非单词字符,即除ASCII字母、数字和_之外的字符。如果在当前位置的右侧有一个单词char,则(?!\w)是一个负向先行查找,它会导致匹配失败。
或者,使用ECMAScript 2018兼容的JS环境,
/(?<!\w)\?FOO\?(?!\w)/g(?<!\w)是一个负向回溯,如果在当前位置的左边有一个单词char,则会导致匹配失败。
在代码中,您可以像s.match(/(?<!\w)\?FOO\?(?!\w)/g)一样直接在String#match中使用它来提取所有匹配项。
第一个表达式需要一个围绕需要提取的单词的捕获组:
var strs = ["?FOO is cool", "I love ?FOO", "FOO is cool", "FOO?is cool", "aaFOO?is cool"];
var rx = /(?:^|\W)(\?FOO)(?!\w)/g;
for (var s of strs) {
var res = [], m;
while (m=rx.exec(s)) {
res.push(m[1]);
}
console.log(s, "=>", res);
}
https://stackoverflow.com/questions/52212874
复制相似问题