Javascript 如果将正则表达式传递给;RegExp";建造师?

Javascript 如果将正则表达式传递给;RegExp";建造师?,javascript,regex,Javascript,Regex,假设我有以下正则表达式: /hello\sworld\!/g new RegExp("ab+c", "i"); new RegExp(/ab+c/, "i"); 如果我将此正则表达式传递给RegExp构造函数,不带引号: new RegExp(/hello\sworld\!/g) 它会返回一个正则表达式,其中包含/hello\sworld\/g,如下所示: /\/hello\sworld\!\/\g/ 还是返回原始正则表达式?根据,以下表达式创建相同的正则表达式: /hello\swor

假设我有以下正则表达式:

/hello\sworld\!/g
new RegExp("ab+c", "i");
new RegExp(/ab+c/, "i");
如果我将此正则表达式传递给
RegExp
构造函数,不带引号:

new RegExp(/hello\sworld\!/g)
它会返回一个正则表达式,其中包含
/hello\sworld\/g
,如下所示:

/\/hello\sworld\!\/\g/
还是返回原始正则表达式?

根据,以下表达式创建相同的正则表达式:

/hello\sworld\!/g
new RegExp("ab+c", "i");
new RegExp(/ab+c/, "i");
预期结果:

/ab+c/i
/ab+c/
/ab+c/g
/ab+c/m
如果传递带有标志的正则表达式文字,但在第二个参数中未定义新标志,则结果也将相同,例如:

new RegExp(/ab+c/i)
应返回相同的正则表达式文字(
/ab+c/i
),但如果指定了新的正则表达式标志(在第二个参数中),则所有现有标志都将被删除

new RegExp(/ab+c/i, "")
new RegExp(/ab+c/i, "g")
new RegExp(/ab+c/i, "m")
预期结果:

/ab+c/i
/ab+c/
/ab+c/g
/ab+c/m
文字符号的作用是什么

文本表示法在计算正则表达式时提供正则表达式的编译

我应该什么时候使用文字符号

当正则表达式保持不变时,使用文字表示法。例如,如果使用文字符号来构造循环中使用的正则表达式,则不会在每次迭代中重新编译正则表达式

构造函数的作用是什么

正则表达式对象的构造函数(例如,new
RegExp('ab+c')
)提供正则表达式的运行时编译

我应该什么时候使用构造函数

当您知道正则表达式模式将要更改,或者您不知道该模式并从其他源(如用户输入)获取它时,请使用构造函数


祝你好运。

不幸的是,自我回答有些常见。有些人会说:“哦,如果你知道答案,那你为什么要问呢?”然后投反对票。我真的不喜欢这种情况,但唉,它发生了。不管怎样,我觉得这个自我回答很好。我见过其他人不是这样的,应该被否决,只是因为他们要么不好,要么根本不相关。我认为你的很好,很有意义。我希望它能帮助别人。我建议进行改进-如果您将带有标志的正则表达式文本传递给正则表达式构造函数,您可以对发生的情况进行扩展-
newregexp(/abc/I)
-现在还没有明确说明这一点。@VLAZ很好的建议,我已经做了一些测试并更新了我的答案。我现在唯一的问题是我不能再投票了。我知道
newregexp(/abc/I)
生成
/abc/I
,但我从来没有想到您可以将标志和带有标志的regex文本传递给构造函数。谢谢!另外,我还希望它会在我累的时候抛出一个错误,但当我看到它起作用时,这是一个真正的“啊哈!抓住你了”的时刻。我在其他几种语言中也尝试过这样做,但大多数都出现了错误/异常,表示不允许重复参数和/或多个标志定义。除了只提供了Link警告的Type Script。我同意@ VLAZ对这个问题的评论,这是一个很好的自我回答的Q/A——你可能想考虑将一个堆栈片段添加到代码段的控制台来演示你所写的东西。我想这是个很好的时机——我想悬赏你,但我需要等24小时。干杯:)@VLAZ-Gee,谢谢!尽管赞成票也同样值得赞赏:)