例如,我从服务器的客户端获得了一个字符串:
#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)
这样做的正确方法是什么?
答案 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'))
);