gpt4 book ai didi

javascript - RegExp 转到 toString 然后返回时出现意外行为

转载 作者:行者123 更新时间:2023-12-03 01:21:01 25 4
gpt4 key购买 nike

我需要序列化一些 JavaScript 正则表达式。

我的计划是使用 .toString() 进行序列化,然后使用 new RegExp(string) 进行反序列化,但这并不像我期望的那样工作 - 正则表达式字符串 / 中的分隔符由 new RegExp() 转义。这是一个例子:

let regEx = /^[A-Z][A-Z-\\.]+$/g;
console.log("Initial: " + regEx.source);

let regExString = regEx.toString();
console.log("toString(): " + regExString);

let nRegEx = new RegExp(regExString);
console.log("new RegExp from string:" + nRegEx.source);

返回以下内容:

"Initial: ^[A-Z][A-Z-\\.]+$"
"toString(): /^[A-Z][A-Z-\\.]+$/g"
"new RegExp from string:\/^[A-Z][A-Z-\\.]+$\/g"

如果我这样做(regEx.source.toString()):

let regEx = /^[A-Z][A-Z-\\.]+$/g;
console.log("Initial: " + regEx.source);

let regExString = regEx.source.toString();
console.log("toString(): " + regExString);

let nRegEx = new RegExp(regExString);
console.log("new RegExp from string:" + nRegEx.source);

结果是:

"Initial: ^[A-Z][A-Z-\\.]+$"
"toString(): ^[A-Z][A-Z-\\.]+$"
"new RegExp from string:^[A-Z][A-Z-\\.]+$"

哪个更好,但它丢失了我的所有标志,在本例中 /g

我该怎么做才能让这项工作成功?

最佳答案

也许不是最优雅的解决方案,但您可以将 toString 结果拆分为 RE 和修饰符,例如:

let regEx = /^[A-Z][A-Z-\\.]+$/g;
console.log("Initial: " + regEx.source);

let regExString = regEx.toString();
console.log("toString(): " + regExString);

let arrRegEx = regExString.split('/');

let nRegEx = new RegExp(arrRegEx[1], arrRegEx[2]);
console.log("new RegExp from string:" + nRegEx.source);
console.log("global: " + nRegEx.global ? 'true' : 'false');

(请注意,使用 split 会使第一个索引为空。因此索引 1 和 2 作为 new 的输入。)

编辑

如果 RE 中存在垃圾 /,上述操作将会失败。使用正则表达式提取部件将解决这个问题:

    let regEx = /^[A-Z][A-Z-\/\\.]+$/gi;
console.log("Initial: " + regEx.source);

let regExString = regEx.toString();
console.log("toString(): " + regExString);

let arrRegEx = /^\/(.*)\/([gmi]*)/.exec(regExString);
console.log("RegEx:" + arrRegEx[1] + ", flags:" + arrRegEx[2]);

let nRegEx = new RegExp(arrRegEx[1], arrRegEx[2]);
console.log("new RegExp from string:" + nRegEx.source);
console.log("global: " + nRegEx.global);
console.log("ignoreCase: " + nRegEx.ignoreCase);
console.log("multiline: " + nRegEx.multiline);

关于javascript - RegExp 转到 toString 然后返回时出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51764775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com