Javascript RegExp.prototype.test - 如何使用来自数组的正则表达式值

时间:2018-03-15 03:04:39

标签: javascript

如果匹配字符串,我想检查数组中的每个值, 但是当我使用console.log(/^reg_arr[i]/.test(str1));时它不起作用 但是当我使用console.log(/^table/.test(str1));时,它可以正常工作

var str1 = 'table football';
var reg_arr = ["table","football"];
        
for(var i = 0, reg_arr_length = reg_arr.length; i < reg_arr_length; i++)
{
   console.log(/^reg_arr[i]/.test(str1)); /* doesnt work */
}

console.log(/^table/.test(str1)); /* this works */

我的语法是否有问题,

谢谢,

2 个答案:

答案 0 :(得分:1)

使用new RegExp(source: string[, flags: string])(简称RegExp(source: string[, flags: string])也正常)

var str1 = 'table football';
var reg_arr = ["table","football"];
        
for(var i = 0, reg_arr_length = reg_arr.length; i < reg_arr_length; i++)
{
   console.log(new RegExp(`^${reg_arr[i]}`).test(str1));
}

答案 1 :(得分:0)

使用斜杠定义正则表达式并不允许您在正则表达式中输入变量,也就是说,在以下示例中,str1被选中包含"test",而不是变量测试的值。

var str1 = "hello";
var str2 = "Hello world";
console.log(/str1/i.test(str2))

要解决此问题,您需要为数组中的每个值创建一个新的正则表达式,这可以使用new RegExp(str)而不是斜杠来完成。

var str1 = "hello";
var str2 = "hello world";
console.log(new RegExp(str1, "i").test(str2))

但是,此方法有一个catch,该字符串中的字符不会被转义。因此new RegExp("test.hello")将匹配"test hello",因为该点被解释为正则表达式通配符而不是句点。要解决这个问题,我们首先必须手动转义搜索字符串中的任何特殊字符(除非事件reg_arr实际上是正则表达式)。我从this MDN page.

的中间接受了代码
var str1 = "hello"
var str2 = "hello world"

str1.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
console.log(new RegExp(str, "i").test(str2))

因此,在不更改任何其他内容的情况下,您的最终console.log可能如下所示:

console.log(new RegExp(reg_arr[i].replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).test(str1));