首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配以特殊字符开头或结尾的整个单词

匹配以特殊字符开头或结尾的整个单词
EN

Stack Overflow用户
提问于 2018-09-07 06:27:11
回答 1查看 139关注 0票数 2

我需要一个正则表达式在javascript中匹配以特殊字符开头或结尾的整个单词?

这应该很简单,但由于某种原因,?之后的\b并没有像我预期的那样运行:

代码语言:javascript
运行
复制
> /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?很酷“

我希望这是有意义的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-07 06:54:53

\b单词边界结构不明确。您需要使用明确的构造,以确保匹配的单词的左侧/右侧有非单词字符或字符串的开头/结尾。

您可以使用

代码语言:javascript
运行
复制
/(?:^|\W)\?FOO\?(?!\w)/g

在这里,(?:^|\W)是一个非捕获组,它匹配字符串的开头或任何非单词字符,即除ASCII字母、数字和_之外的字符。如果在当前位置的右侧有一个单词char,则(?!\w)是一个负向先行查找,它会导致匹配失败。

或者,使用ECMAScript 2018兼容的JS环境,

代码语言:javascript
运行
复制
/(?<!\w)\?FOO\?(?!\w)/g

参见this regex demo

(?<!\w)是一个负向回溯,如果在当前位置的左边有一个单词char,则会导致匹配失败。

在代码中,您可以像s.match(/(?<!\w)\?FOO\?(?!\w)/g)一样直接在String#match中使用它来提取所有匹配项。

第一个表达式需要一个围绕需要提取的单词的捕获组:

代码语言:javascript
运行
复制
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);
}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52212874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档