如何在javascript中将字符串转换为正则表达式

时间:2017-03-04 02:05:00

标签: javascript regex node.js

例如,我从服务器的客户端获得了一个字符串:

#uploadLabelDiv {
  position: relative;
  max-width: 400px;
  background: transparent;
  color: #fff;
  transition: all 0.3s;
}

.fade {
  opacity: 1;
}

.fade:hover > label {
  opacity: 0.4;
}

.fade > p {
  opacity: 0;
  transition: none;
}

.fade:hover > p {
  opacity: 1;
  transition: all 0.3s;
}

p {
  position: absolute;
  top: calc(50% - 30px);
  left: calc(50% - 60px);
  color: black;
  font: bold;
}

在客户端我想将此字符串转换为正则表达式对象。我试过了

"/hello\s{0,1}[-_.]{0,1}world|ls\b/gim"

但这不起作用,返回的对象是

new RegExp("/hello\s{0,1}[-_.]{0,1}world|ls\b/gim")

总结一下: 我想要的是:

/\/hellos{0,1}[-_.]{0,1}world|ls\/gim/

但是这不起作用:

/hello\s{0,1}[-_.]{0,1}world|ls\b/gim.test('hello world') //true (correct behavior)

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

RegExp构造函数有两个参数。第一个是要匹配的文字源/模式(基本上是正则表达式文字中外部/之间的东西);第二个是要在该表达式上设置的标志(例如,在您的示例中为gim)。我在下面为您定义了一个帮助函数,它将您格式的字符串转换为正则表达式。具有讽刺意味的是,我最终使用了另一个正则表达式。



function regexFromString (string) {
  var match = /^\/(.*)\/([a-z]*)$/.exec(string)
  return new RegExp(match[1], match[2])
}

var string = '/hello\\s{0,1}[-_.]{0,1}world|ls\\b/gim'

var regex = regexFromString(string)

console.log(regex instanceof RegExp) //=> true
console.log(regex)
console.log(regex.test('hello world')) //=> true




答案 1 :(得分:0)

使用RegExp构造函数有点不同,以下是我认为您正在寻找的内容:

var x = new RegExp('hello\\s{0,1}[-_.]{0,1}world|ls\\b', 'gim').test("hello world");

console.log(x);

返回true

答案 2 :(得分:0)

迟到

一种基于正则表达式本身的方法将 capture 从任何提供的字符串化正则表达式文字中d = document.getElementById('d'); d.addEventListener('drag', function(e){ console.log("drag:", e) }); d.addEventListener('dragstart', function(e){ e.dataTransfer.setData('application/node type', this); console.log("dragstart:", e) }); 及其可选的 body 部分。

正则表达式本身可能看起来像这样... /^\/(?<body>.*)\/(?<flags>[gimsuy]*)$/ ... 而使用此正则表达式的故障安全方法可能看起来像下面的...

flags
// see ... [https://regex101.com/r/Ek881d/2]

function regexFromString(str) {
  const {
    body,
    flags,
  } = String(str)
    .match(/^\/(?<body>.*)\/(?<flags>[gimsuy]*)$/)
    ?.groups || {};

  return RegExp(body, (body && flags));
}

console.log(
  "regexFromString(String(/hello\s{0,1}[-_.]{0,1}world|ls\b/gim)).test('hello world') ? ",

  regexFromString(
    String(/hello\s{0,1}[-_.]{0,1}world|ls\b/gim)
  ).test('hello world')
);
console.log(
  "regexFromString('') ...",
  regexFromString('')
);

console.log(
  regexFromString('/foo/'),
  'this isfoook'.split(regexFromString('/foo/'))
);
console.log(
  regexFromString('/foo\\/bar/ig'),
  'this isfoo/barok'.split(regexFromString('/foo\\/bar/ig'))
);
console.log(
  regexFromString('/foo/bar/ig'),
  'this isfoo/barok'.split(regexFromString('/foo/bar/ig'))
);