【问题标题】:How to parse a regex text with Json如何使用 Json 解析正则表达式文本
【发布时间】:2016-08-19 02:38:41
【问题描述】:

我有这个字符串要转换为 JSON 对象,问题是对象的字段之一是正则表达式:

"{
     \"regex\": /^([a-zA-Z0-9_\\.\\-\\+%])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$/,
     \"alertText\": \"test\"
}"

有没有办法在不进行数百次替换的情况下获取 JavaScript 对象?

编辑:我使用以下代码存储来自Stringifying a regular expression? 的原始对象的正确序列化版本:

RegExp.prototype.toJSON = function() { return this.source; };

然后我可以修改字符串的内容:

{"regex":"^([a-zA-Z0-9_\\.\\-\\+%])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$","alertText":"* {{alertText}}"}

所以我可以将它用作模板,然后在需要时 JSON.parse 字符串以获取新对象。

【问题讨论】:

  • 我想了解更多关于如何获得此内容的 JS 和 HTML。CRLF 字符使这变得不必要地复杂
  • 首先是什么将它序列化为字符串?问的原因:它有可以使用的解析对应项吗?
  • Regex 在 JavaScript 中不需要用引号括起来,但 JSON 不支持 Regex 文字。编写一个原型函数来将您的正则表达式转换为 JSON 字符串和从 JSON 字符串转换。见stackoverflow.com/questions/20276531/…
  • 您没有 JSON,因为您有一个非标量值(正则表达式文字)。您需要确保 1) 您使用适当的序列化技术生成 JSON,而不是手动生成 2) 使用字符串来表示正则表达式,并在您准备好时通过将其传递给 JS 的 RegExp 构造函数来“唤醒它”使用它。
  • c#使用rest web api MVC

标签: javascript json parsing


【解决方案1】:

只需确保您的正则表达式值用引号括起来以强制它为字符串值:

"{
     \"regex\": \"/^([a-zA-Z0-9_\\.\\-\\+%])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$/\",
     \"alertText\": \"test\"
}"

然后,这将正确解析为 JSON 对象,您可以稍后取出正则表达式以从中创建您的正则表达式。

如果您出于正则表达式的目的需要对斜杠进行双重转义,那么...

 "{
     \"regex\": \"/^([a-zA-Z0-9_\\\\.\\\\-\\\\+%])+\\\\@(([a-zA-Z0-9\\\\-])+\\\\.)+([a-zA-Z0-9]{2,4})+$/\",
     \"alertText\": \"test\"
}"

【讨论】:

  • 它仍然无法解析。 VM1526:1 Uncaught SyntaxError: Unexpected token .
  • 这可能是因为你需要将这些反斜杠加倍,现在它在字符串的正则表达式中
  • 谢谢。我只是在最初的示例中将其解析为 JSON,这很好。此后正则表达式的解析是一个单独的问题。我已经修改了答案以涵盖后续问题。
【解决方案2】:

解决方案:

另一种解决方案是更改/重新格式化您的 JSON 字符串,您只需:

  • 将封闭的双引号 " 更改为单引号 '
  • 并且只使用一个反斜杠\ 进行转义。

这是一个有效的演示:

var text = '{"regex": "/^([a-zA-Z0-9_\.\-\+%])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/", "alertText": "test"}';
var obj=JSON.parse(text);

console.dir(obj);
document.write(obj.regex);
document.write("<br>"+obj.alertText);

【讨论】:

  • 这没有回答问题。
  • @randomsock 问题是解析 Javascript 对象,这就是我的建议。
  • 实际上不,您已经展示了一种更改数据以便对其进行解析的方法,而不是如何解析 OP 拥有的数据。问题是如何解析那里的内容而无需进行文本编辑。
  • @randomsock 公平点,你是对的,但我认为这不值得所有这些反对。
  • @randomsock 感谢您指出这一点,您的 cmets 非常有帮助。
【解决方案3】:

简短的回答是不。

到目前为止,答案依赖于能够从源头更改字符串。如果你能做到这一点,那就太好了,但根据 OP,你不能使用普通的 JSON.parse() 解析带有正则表达式值的 JSON,即使使用 reviver 函数也是如此。

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 2016-04-27
    • 1970-01-01
    • 2020-09-17
    • 2018-05-07
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多