Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 将具有特殊字符的用户输入字符串转换为正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 将具有特殊字符的用户输入字符串转换为正则表达式

Javascript 将具有特殊字符的用户输入字符串转换为正则表达式,javascript,regex,Javascript,Regex,注意:有一个类似的问题,但因为它没有“特殊字符”,这里的问题只是“特殊字符”,我发布了一个新问题 我有一个正则表达式表示的列表(来自用户输入文本区域): 示例:(简化) 我需要将它们转换成一个数组来检查(有效性)并准备好每一行,例如(简化) 我一定是遗漏了什么 更新 我忽略了一点,即来自文本区域(或类似区域)的数据根本不需要转义。当我测试代码时,我像上面那样测试它,但它不起作用。让我们在上使用“change”事件,这样,一旦用户更改内容并单击外部,我们就可以访问它的value属性,然后就可以构造

注意:有一个类似的问题,但因为它没有“特殊字符”,这里的问题只是“特殊字符”,我发布了一个新问题

我有一个正则表达式表示的列表(来自用户输入文本区域):

示例:(简化)

我需要将它们转换成一个数组来检查(有效性)并准备好每一行,例如(简化)

我一定是遗漏了什么

更新
我忽略了一点,即来自文本区域(或类似区域)的数据根本不需要转义。当我测试代码时,我像上面那样测试它,但它不起作用。

让我们在
上使用
“change”
事件,这样,一旦用户更改内容并单击外部,我们就可以访问它的
value
属性,然后就可以构造复合RegExp对象。我根本不需要转义
\
字符

只需将以下内容复制粘贴到文本区域,然后单击“外部”

/ab+c/
/Chapter (\d+)\./
/\d+/
/d(b+)d/
var myTextarea=document.getElementById(“ta”);
myTextarea.addEventListener(“更改”,函数(e){
var str=e.currentTarget.value.split(/[\r\n]+/)
.map(s=>s.slice(1,-1))
.加入(“|”);
rgx=新的RegExp(str,“i”)
log(`Derived RegExp object:${rgx}`);
console.log(`Testing for'dbbbd':${rgx.test('dbbbd')}`);//true
console.log(`Testing for'256':${rgx.test('256')}`);//true
});
#ta{
宽度:33vw;
高度:50vh;
左边距:33vw;
}

RegExp对象不是字符串类型。首先,您必须像
/\d+/.toString()那样执行操作
或使用类型强制,如
myRegExpObj+“”
,然后执行字符串操作。由于字符串已经是正则表达式,因此不需要替换任何内容。仅当您希望按字面形式匹配特殊字符时,才需要这样做,但这里的情况并非如此。您从何处接收此regexp字符串。。?我想如果字符串被认为代表regexp,那么所有\字符都应该像\\一样转义。如果您检查,它们已经是字符串,而不是对象。它们是字符串或regexp对象(也称为普通regexp)。如果regexp由模板文本表示,就像您的示例中一样。。。然后“\”字符必须像“\ \”@erosman no一样转义,
new RegExp()
不需要double\如果您确实想要正则表达式的含义(例如,数字的
\d
)。需要它的是字符串文字,因为\用于某些转义序列,如
\n
和许多其他转义序列。在原始代码中,字符串中应该有\\,但以后不要再对其进行操作。如果正则表达式来自其他地方(HTML输入、JSON…),那么您根本不需要做任何事情。@erosman我在
中展示了它,因为您在一条评论中提到了它。它可以很好地处理
'256'
在上面的代码中返回
true
。你能告诉我这根弦的确切来源吗?事实上,我错了。textarea中的数据不需要转义就可以工作,但在我尝试时它不起作用。它是一个代码字符串:(@erosman I-understand
“自动”转义特殊字符,因此当我们
console.log()
value
属性字符串看起来正常。您可以将该字符串存储在
localStorage
中并检索,它将保持不变。因此,当您从头开始在代码中手动构造字符串时,您应该通过执行
myText+“\\”或
myText+string.fromCharCode(92)来添加\个字符
。另一方面,从API调用接收的任何字符串,如果在
console.log()时看起来合适
,已经像
中的字符串一样转义了反斜杠。你是对的……我完全没有注意到这一点。:p我是在使用字符串文本进行测试,而不是使用实际情况进行测试,因此我没有注意到这一点。我还没有注意到,即使在获取文本区域、输入和存储数据之后,它们也不会作为字符串文本进行处理ting分配给了一个变量。很抱歉我的混淆。
let arr = str.split(/[\r\n]+/);

for (let i = 0, len = arr.length; i < len; i++) {

  arr[i] = arr[i].slice(1, -1); // removing the start/end slashes
  // problem with double slashing the Special characters
  // it doesn't give the required result
  arr[i] = arr[i].replace(/\\/g, '\\$&');
  // same result with replace(/\\/g, '\\\\')
}
let regex = new RegExp(arr.join('|'), 'i'); 

console.log(regex.test('dbbbd')); // true
console.log(regex.test('256')); // false
/ab+c/
/Chapter (\d+)\./
/\d+/
/d(b+)d/