【问题标题】:Regexp range selection [duplicate]正则表达式范围选择[重复]
【发布时间】:2020-05-21 11:08:58
【问题描述】:

我需要使用正则表达式查找 JSON 文档的键值对。问题是我无法正确理解如何确定匹配数据的选择范围。

使用这个正则表达式,

"email"\s*:\s*".*"

它将选择整个文档,直到找到最后一个"

但我只想选择第一个 ",所以选择是这样的:

“电子邮件”:“foobar@foo.bar”

为了实现这一点,我尝试使用这样的锚:

"email"\s*:\s*^".*"$

但它没有按预期工作。 实现这一目标的更好方法是什么?

请注意,如果电子邮件包含双引号,则 json 字符串将如下所示:

{"email":"foo@bar.c\"om"}

在上述情况下,我们可能还需要能够跳过所有\"

我还需要从一个包含 1.6m + 内联 JSON 文档的大文件中获取这些数据。

游乐场:https://regexr.com/552pt

【问题讨论】:

  • 不要使用 RegEx 解析 JSON,它们不适合。相反,使用json_decode()
  • 使用json_decode()实际上会变得如此缓慢

标签: json regex


【解决方案1】:

只需添加一个问号,使其查找最小值而不是最大值

"email"\s*:\s*".*?"

【讨论】:

  • 如果电子邮件中已经包含双引号怎么办?这是一个有效的格式
  • @Cid 其实很好,是的,如果电子邮件中已经包含双引号,它就会中断。
  • 我们可能需要从{"email":"foo@bar.c\"om"}这样的字符串中跳过\"
  • 电子邮件地址的名称部分在技术上可以用双引号括起来,但据我所知,它不能只包含一个双引号。但大多数网络邮件提供商(如 Gmail)也不允许使用这种格式,因此生成 JSON 的任何东西也可能不允许使用这种格式。
  • 如果你真的想跳过\",应该这样做:"email"\s*:\s*".*?((?<!\\)")。我知道这是你想要的,但你真的应该使用 json 解析器。您将使用边缘情况扩展这个正则表达式,直到它变得难以理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2016-04-16
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多