JavaScript 正则表达式替换整个单词

5

我有一个变量:

var str = "@devtest11 @devtest1";

我用以下方法将@devtest1替换为另一个字符串:
str.replace(new RegExp('@devtest1', 'g'), "aaaa")

然而,它的结果(aaaa1 aaaa)并不是我期望的结果。期望的结果应该是:@devtest11 aaaa。我只想替换整个单词@devtest1。您怎么做到?
3个回答

10

使用 \b 零宽度单词边界断言。

var str = "@devtest11 @devtest1";
str.replace(/@devtest1\b/g, "aaaa");
// => @devtest11 aaaa

如果您还需要防止匹配像hello@devtest1这样的情况,您可以这样做:

var str = "@devtest1 @devtest11 @devtest1 hello@devtest1";
str.replace(/( |^)@devtest1\b/g, "$1aaaa");
// => @devtest11 aaaa

\b 在开头有点棘手,想象一下输入为:"!!@devtest1",模式为 /\b@devtest1\b/。在 "!" 和 "@" 之间没有单词边界。(也就是说,单词边界的定义是具体的,但并不总是适用的。) - user2864740
2
展示你尝试过的内容。(正如@user2864740所说,它在开始时不起作用;但那不是问题示例遇到麻烦的原因。) - Amadan
@user2864740 那我该怎么做呢? - Snow Fox
这也会匹配hello@devtest1,这不是操作者期望的。 - Anirudha
@Anirudha,是的,它会。正如我所说,如果这是一个失败的情况,OP应该提到它。例如,在UNIX中,a b$cd e正在读取变量$cd,而abe是单独的标记,这是此情况的正确行为。我更喜欢不解决不需要解决的问题。 - Amadan
显示剩余2条评论

1
使用单词边界\b来限制搜索范围。
由于@是特殊字符,您需要在单词外匹配它。 \b断言位置在单词边界上(^\w|\w$|\W\w|\w\W),因为\b不包括特殊字符。

var str = "@devtest11 @devtest1";
str = str.replace(/@devtest1\b/g, "aaaa");

document.write(str);

如果您的字符串始终以@开头,并且不希望其他字符匹配。

var str = "@devtest11 @devtest1";
str = str.replace(/(\s*)@devtest1\b/g, "$1aaaa");
//                 ^^^^^                ^^

document.write(str);


匹配 hello@devtest1 的相关编程内容。 - Anirudha
@Anirudha,请检查另一个解决方案,现在它不会出错了。 - Tushar
@Anirudha 请再次检查。我已更新答案,不会删除空格。感谢指出错误。 - Tushar
可选的空格将再次匹配hello@devtest1 :) - Amadan
@Anirudha:对我来说,这就是一个单词边界。如果不是的话,我再次归咎于OP模糊的问题定义(在@devtest11不是一个单词的情况下不准确地使用“整个单词”)。 - Amadan
显示剩余4条评论

1
如果单词被非空格字符包围,\b 将无法正常工作。我建议使用以下方法。
var output=str.replace('(\s|^)@devtest1(?=\s|$)','$1aaaa');

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