将字符串化的regexp映射到regexp

Map stringified regexp to RegExp

本文关键字:regexp 映射 字符串      更新时间:2023-09-26

我想做以下事情:

var regex = /^'/(.*)'/?$/i;
// "/^'/(.*)'/?$/i"
var stringifiedRegex = regex.string();
// //^'/(.*)'/?$/i/
var newRegex = new RegExp(stringifiedRegex);

正如您所看到的,当将字符串化的正则表达式转换回真正的RegExp时,正则表达式会被修改,不再与原始正则表达式匹配。

知道怎么解决这个问题吗?

Bodo

如果将正则表达式存储为单个字符串(包括所有标志),则可以使用正则表达式将正则表达式拆分为需要传递给new RegExp的部分(好吧,那是一句话…):

> regex = /^'/(.*)'/?$/i;
/^'/(.*)'/?$/i
> str = regex.toString()
"/^'/(.*)'/?$/i"
> m = str.match(/^[/](.*)[/]([^/]*)$/)
["/^'/(.*)'/?$/i", "^'/(.*)'/?$", "i"]
> newRegex = new RegExp(m[1], m[2])
/^'/(.*)'/?$/i

正则表达式匹配/,然后捕获尽可能多的内容,然后匹配关闭的/并捕获可能的标志。

或者,如果您可以将其存储在数据库中的多个字段中,请分别存储源字符串和三个标志的布尔值:

> regex = /^'/(.*)'/?$/i;
/^'/(.*)'/?$/i
> regex.source
"^'/(.*)'/?$"
> regex.global
false
> regex.ignoreCase
true
> regex.multiline
false