如何将正则表达式转换为字符串字面值,然后再转回正则表达式?

9

我该如何:

  1. 将带有标志的JavaScript RegExp转换为字符串字面量(类似JSON),
  2. 并将该字面量转换回正则表达式?

例如,对于字符串"the weather is nice today"

var myRe = new RegExp("weather","gi");
var myReToString = myRe.toString(); // myReToString is now "/weather/gi"

var myReCopy = /* How to get this copy only from myReToString ? */

要修改原始的RegExp属性,请参见torazaburo的答案


7
请问将正则表达式转换为字符串再转回来的用例是什么? - swlim
3
你的 .replace() 方法会破坏任何原始表达式中包含正斜杠的正则表达式。此外,你的技巧假设应该始终使用 gi 标志。 - nnnnnn
2
eval 可以做到。 - Bergi
1
完成。您认为如何?同时,如果您不喜欢我的更改,可以自由地[撤销]您的帖子。 - Kyll
显示剩余3条评论
3个回答

7

看一下RegExp原型上的访问器属性,比如sourceflags。这样你就可以这么做:

var myRe = new RegExp("weather", "gi")

var copyRe = new RegExp(myRe.source, myRe.flags); 

有关规范,请参见http://www.ecma-international.org/ecma-262/6.0/#sec-get-regexp.prototype.flags

正则表达式的序列化和反序列化

如果您的目的是将正则表达式序列化,例如转换为JSON格式,然后再进行反序列化,我建议将正则表达式存储为[source, flags]元组,并使用new RexExp(source, flags)重新构建它。这比尝试使用正则表达式或eval拆分它更加简洁。例如,您可以将其字符串化为

function stringifyWithRegexp(o) {
  return JSON.stringify(o, function replacer(key, value) {
    if (value instanceof RegExp) return [value.source, value.flags];
    return value;
  });
}

回来的路上,你可以使用带有修饰符的JSON.parse来获取正则表达式。

修改正则表达式

如果您想在保留标志的同时修改正则表达式,可以创建一个新的正则表达式,其源已修改并且具有相同的标志:

var re = /weather/gim;
var newre = new RegExp(re.source + "| is", re.flags);

3
重点是您无法访问原始正则表达式。 - 4castle
2
“and back again?” 意味着从字符串中转换。步骤1的输出是步骤2的输入。 - 4castle
4
因此,向发帖人提出问题,询问他/她为什么需要这样做。也许有更好的解决方法能够解决根本问题 :) - swlim
实际上你回答了我想问的问题,感谢@SWLim要求澄清。因为直接回答问题的答案是eval,所以我接受了它作为答案,但是你的确解决了我的问题,这在编辑中提到了你的答案。 - user2305193
3
没问题。只是提醒一句,我建议避免使用eval(谷歌搜索“javascript evil eval”会显示许多相关文章),但只要你知道自己在做什么,应该就没问题了。 - swlim

3
您可以使用 eval 来获取正则表达式:
var myRe = RegExp("weather", "gi");
var myReString = myRe.toString();
eval(myReString); // => /weather/gi

注意: eval 可以执行任意的 JavaScript 表达式。仅在确定字符串是由正则表达式 toString 方法生成时使用 eval


3

我不确定这段代码是否适用于所有情况,但我确信可以使用正则表达式来完成:

var regex = new RegExp('^/(.+)/(.*)$')
function stringToRegex(s) {
    var match = s.match(regex)
    return new RegExp(match[1], match[2])
}

var test = new RegExp("weather", "gi")

console.log(stringToRegex(test.toString()))
console.log(stringToRegex(test.toString()).toString() === test.toString())

正则表达式可视化

Debuggex演示


1
我非常确定这在所有情况下都有效,因为 .+ 是贪婪的。第二个 / 只会匹配字符串中的最后一个。 - 4castle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接