注意:有一个类似的问题,但由于它没有“特殊字符”,而这里的问题仅与“特殊字符”有关,我发布了一个新问题。
我有一个正则表达式表示的列表(来自用户输入文本区域):
示例:(简化)
// 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
我一定是漏掉了什么。
更新
我忽略了一点,即来自文本区域(或类似区域)的数据根本不需要转义。当我测试代码时,我像上面那样测试它不起作用。
最佳答案
让我们使用 "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
});
#ta {
width: 33vw;
height: 50vh;
margin-left: 33vw;
}
<textarea id="ta"></textarea>
关于javascript - 将带有特殊字符的用户输入字符串转换为正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46502157/