请问一个正则表达式匹配单词的问题?

类似这样字符串 "abc abcdef abc abc abc-def def-abc def-abc-def"
希望匹配出所有的独立的单词 abc,但不要包含空格,也排除abc-def等有连字符等情况

阅读 8.4k
4 个回答

\babc\b就可以了,\b表示单词边界

let reg = /\babc\b/g;
reg.exec('abc abcdef abc abc abc-def def-abc def-abc-def')

=====================
不好意思,试了一下发现不行,因为-也算单词边界
应该改成这样(?<=\s|^)abc(?=\s|$)
但是如果是javascript的话,因为js不支持回顾零宽断言((?<=)(?<!)),所以建议的方法是先用空格把输入split,然后匹配^abc$

let arr = 'abc abcdef abc abc abc-def def-abc def-abc-def'.split(' ');
for (let s of arr) {
    if (s.match(/^abc$/)) {
        console.log(s);
    }
}

同意以上答案, 已点赞.

验证

至少在Ruby/(?<=\s|^)abc(?=\s|$)/可以原样写.

不过, Ruby中没必要循环匹配.

str = "abc abcdef abc abc abc-def def-abc def-abc-def"
pat = /(?<=\s|^)abc(?=\s|$)/
str.scan(pat)  #=> 返回所有匹配的字串数组
str.gsub(pat, 'xxx')  #=> 将匹配的字串替换为'xxx', 可验证是否正确匹配

遇到了类似的问题,终于想到个一次性去掉所有单独的abc的办法

"abc abcdef abc abc abc-def def-abc def-abc-def abc abc".replace(/\s/g,"  ").replace(/^abc$|^abc\s|\sabc$|\sabc\s/g," ")

返回的字符串不包含独立的abc

题主你好,我觉得上面的答案都不太简洁,请考虑下这个 /abc(?=($|s))/

括号里是美元符号或者斜杠s,这网站把反斜杠给转义了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏