注意:有一个类似的问题,但由于它没有“特殊字符”,这里的问题只有“特殊字符”,我发布了一个新问题。
我有正则表达式表示的列表(来自用户输入textarea):
示例:(简化)
// starting point is a string like this one
let str = `/ab+c/
/Chapter (\d+)\.\d*/
/\d+/
/d(b+)d/`;
我需要将它们转换为数组以检查(有效性)并准备每一行,例如(简化的)
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, '\\\\')
}
最后,将它们转换为一个RegEx对象
let regex = new RegExp(arr.join('|'), 'i');
console.log(regex.test('dbbbd')); // true
console.log(regex.test('256')); // false
我必须在这里遗漏一些东西。
更新
我错过了来自textarea(或类似)的数据根本不需要转义的观点。当我测试代码时,我正在测试它,就像上面那样无效。
答案 0 :(得分:1)
让我们使用"change"
上的<textarea>
事件,这样一旦用户更改内容并点击外部,我们只需访问它的value
属性,然后我们就可以构造复合的RegExp对象。我根本没有必要逃脱\
字符。
只需将以下内容粘贴到文本区域,然后点击外面即可。
/ab+c/
/Chapter (\d+)\./
/\d+/
/d(b+)d/
var myTextarea = document.getElementById("ta");
myTextarea.addEventListener("change", function(e) {
var str = e.currentTarget.value.split(/[\r\n]+/)
.map(s => s.slice(1, -1))
.join("|");
rgx = new RegExp(str, "i")
console.log(`Derived RegExp object: ${rgx}`);
console.log(`Testing for 'dbbbd': ${rgx.test('dbbbd')}`); // true
console.log(`Testing for '256': ${rgx.test('256')}`); // true
});
&#13;
#ta {
width: 33vw;
height: 50vh;
margin-left: 33vw;
}
&#13;
<textarea id="ta"></textarea>
&#13;