我在替换某些以 #
开头的单词时遇到问题。我有以下代码
var x="#google",
eval("var pattern = /" + '\\b' + x + '\\b');
txt.replace(pattern,"MyNewWord");
当我使用以下代码时,它工作正常
var x="google",
eval("var pattern = /" + '\\b' + x + '\\b');
txt.replace(pattern,"MyNewWord");
效果很好
关于如何使代码的第一部分工作的任何建议
ps。我使用 eval
因为 x
将是用户输入。
最佳答案
问题在于 \b
表示“单词”字符(字母、数字或下划线)和“非单词”字符(任何其他字符)之间的边界。 #
是非单词字符,因此 \b#
表示“前面有单词字符的 #
“——这根本不是你想要的。如果有的话,你想要更像 \B#
; \B
是一个非边界,因此 \B#
表示“一个#
,不是 前面有一个单词字符"。
我猜您希望您的单词由空格分隔,而不是通过编程语言概念来分隔某些内容,即“单词”字符或“非单词”字符;为此,你可以写:
var x = '#google'; // or 'google'
var pattern = new RegExp('(^|\\s)' + x);
var result = txt.replace(pattern, '$1' + 'MyNewWord');
编辑添加:如果x
确实应该是一个文字字符串,而不是正则表达式,那么您应该“引用”中的所有特殊字符它,带有反斜杠。您可以通过编写以下内容来做到这一点:
var x = '#google'; // or 'google' or '$google' or whatever
var quotedX = x.replace(/[^\w\s]/g, '\\$&');
var pattern = new RegExp('(^|\\s)' + quotedX);
var result = txt.replace(pattern, '$1' + 'MyNewWord');
关于javascript - 正则表达式在 javascript 中获取以 # 开头的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12869360/