【问题标题】:What is the difference between RegExp("str","i") and '/'+"str"+'/i'RegExp("str","i") 和 '/'+"str"+'/i' 有什么区别
【发布时间】:2015-05-24 02:41:01
【问题描述】:

我尝试通过创建这样的字符串来进行不区分大小写的正则表达式搜索:

var regEx = '/'+myStr+'/i';

但是当我在搜索中使用它时,它总是返回-1

如果我使用:

var regEx = RegExp(myStr,'i');

它就像一个冠军。

我只是想知道为什么?

【问题讨论】:

  • 因为第一个是String,第二个是RegExp对象。
  • 更重要的是:第一个是一个字符串,其中包含额外的垃圾“/”字符。当在通常接受字符串的上下文中使用时,这将使其失败。

标签: javascript regex


【解决方案1】:

您的第一个示例将创建一个字符串,而不是正则表达式对象。

var myStr = 'test';
var regEx = '/'+myStr+'/i';
console.log(typeof regEx);//string

使用RegExp 将创建一个正则表达式对象。

var myStr = 'test';
var regEx = RegExp(myStr,'i');
console.log(typeof regEx);//object

因此,当您尝试使用search 方法时,您正在搜索两边斜杠上的字符串,从而得到-1

var s = 'just a test string';
console.log(s.search('/test/'));//-1
console.log(s.search(/test/));//7

当然,字符串search 方法可以与字符串一起使用,在这种情况下,它将搜索该特定子字符串,在您的情况下该子字符串不存在,因此它返回-1 索引。在您的示例中,斜杠被添加到字符串中,而不是生成预期的正则表达式。


在 JavaScript 中,有两种方法可以创建正则表达式对象(不使用代码评估),一种是正则表达式文字,另一种是由RegExp 构造函数创建。

正则表达式字面量必须在编译时定义,不能从字符串连接构造。

/test/i

要在运行时动态创建正则表达式,您必须使用RegExp 构造函数。

RegExp('test', 'i');

【讨论】: