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

标签 javascript regex

注意:有一个类似的问题,但由于它没有“特殊字符”,而这里的问题仅与“特殊字符”有关,我发布了一个新问题。

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

示例:(简化)

// 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/

相关文章:

javascript - JS TinyMCE 正在保存整页

c# - 如何拆分 mysql 命令;不包括拆分时;在顶点之间?

jquery - 在 HREF 中的特定文本上隐藏 div

javascript - 将鼠标悬停在元素上时的文件信息

JavaScript 算法未正确过滤

java 正则表达式匹配器

java - java .net和javascript之间正则表达式的区别?

javascript - 解决正则表达式问题;验证js

javascript - 多个值的颜色转换器

javascript - Skrollr 破坏抵消了 body 100% 的高度