Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式以javascript中的#开始word_Javascript_Regex_Replace_Eval - Fatal编程技术网

正则表达式以javascript中的#开始word

正则表达式以javascript中的#开始word,javascript,regex,replace,eval,Javascript,Regex,Replace,Eval,我在替换某些以#开头的单词时遇到问题。我有以下代码 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"); 它很好用 var x="g

我在替换某些以
#
开头的单词时遇到问题。我有以下代码

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");
它很好用

var x="google",
eval("var pattern = /" + '\\b' + x + '\\b');
txt.replace(pattern,"MyNewWord");
有没有关于如何使代码的第一部分工作的建议


注:我使用
eval
,因为
x
将是一个用户输入。

让你拍下这样的画面:

/(#)?\w*/
怎么样

var x=“#谷歌”


x.match(/^\#/)

如果要生成正则表达式,请尝试以下操作,而不是eval:

var pattern = new RegExp(x);
顺便说一句:

eval("var pattern = /" + '\\b' + x + '\\b');
将由于没有封闭模式而出错,应为:

eval("var pattern = /" + '\\b' + x + '\\b/');

问题是
\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');

不要
eval()
这些!使用
new RegExp('\\b'+x+'\\b')
“因为x将是一个用户输入”是不使用
eval
的一个原因,我的变量x放在哪里?我需要替换每个google(WORD)以#开始,例如我不想替换google norgoogle我只想替换#googleHello Ruakh如果x=“#google”或x,你的代码工作得很完美=“?google”但是如果x=“$google”不起作用,你有什么想法吗?@NavinHarishK:那是因为
$
在正则表达式中有一个特殊的含义——它意味着“字符串的结尾”——所以正则表达式
/(^ |\s)$google/
永远不会与任何东西匹配。要匹配实际的美元符号,你必须用反斜杠“引用”它:
/(^ |\s)\$google/
。如果您希望
x
是一个文本字符串,并且希望精确地找到它的出现处,那么您应该首先引用它的所有特殊字符。在这里,我将更新我的答案。