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

时间:2017-09-30 11:12:44

标签: javascript regex

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

我有正则表达式表示的列表(来自用户输入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(或类似)的数据根本不需要转义的观点。当我测试代码时,我正在测试它,就像上面那样无效。

1 个答案:

答案 0 :(得分:1)

让我们使用"change"上的<textarea>事件,这样一旦用户更改内容并点击外部,我们只需访问它的value属性,然后我们就可以构造复合的RegExp对象。我根本没有必要逃脱\字符。

只需将以下内容粘贴到文本区域,然后点击外面即可。

/ab+c/
/Chapter (\d+)\./
/\d+/
/d(b+)d/

&#13;
&#13;
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;
&#13;
&#13;