【问题标题】:Regex to match keys in json正则表达式匹配 json 中的键
【发布时间】:2014-06-19 14:44:37
【问题描述】:

我正在尝试匹配这种类型的 JSON 中的键:

define({
  key1: "some text: and more",
  key2 : 'some text ',
  key3: ": more some text",
  key4: 'some text:'
});

使用这个正则表达式(?<=\s|{|,)\s*(\w+)\s*:\s?[\"|\']/g。但目前它与最后一个 text: 匹配,也应该被忽略。

一个例子可以看here

您能否给我提示如何修复此正则表达式,使其仅匹配键。

【问题讨论】:

  • 了解您正在使用的 RegEx 的风格肯定会有所帮助。我假设 Perl 或 ECMAScript 兼容?
  • 你能告诉我们你想用json做什么吗?如果您使用 Javascript,则在 Json 中获取密钥只是一个 for .. in ... 循环或 Object.keys(json)。使用正则表达式可能是一项繁琐的任务。

标签: regex json


【解决方案1】:

这个更短的正则表达式怎么样:

(?m)^[ ]*([^\r\n:]+?)\s*:

the demo 中,查看右侧窗格中的第 1 组捕获。

  • (?m) 允许 ^ 在每一行的开头匹配
  • ^ 断言我们位于行首
  • [ ]* 吃掉所有的空格字符
  • ([^\r\n:]+?) 懒惰地匹配冒号 : 或换行符的所有字符,并将它们捕获到第 1 组(这就是我们想要的),直到...
  • \s*: 匹配可选的空白字符和冒号

【讨论】:

  • FYI 添加了解释。 :)
  • [ ]* 使事情变得过于复杂。你可以只使用`*`,你会得到同样的效果。但是,这与换行符、制表符等其他空白字符不匹配,所以我真的会改用\s*
  • @Mario 我非常了解语法,谢谢。 :) [ ]* 是为了便于阅读,可以用太空星代替。但我真的不认为我们不希望在锚点之后出现\s*。 :)
  • @user3599444 不要让这让您感到困惑,如果您有任何问题,请询问。 :)
  • 谢谢,你的正则表达式很短,可以满足我的需要。
【解决方案2】:

我不建议使用正则表达式解析 JSON。为此有一些小型库,有些甚至只有标头,并且具有非常方便的许可条款(例如rapidjson,我现在正在使用它)。

但如果你真的想要,下面的表达式应该会找到你的键/值对(注意我使用的是 Perl,主要是为了漂亮的语法突出显示):

(\w+)\s*:\s*('[^']*'|"[^"]*"|[+\-]?\d+(?:.\d+)?)
  • 请记住,如果值中包含转义引号或未正确括起来的字符串,这将无法正常工作。
  • (\w+) 将匹配完整的密钥。
  • \s* 匹配任何或不匹配空格字符序列。
  • : 真的只是直接匹配。
  • '[^']*' 将匹配 ' 括起来的任何字符(该括号的第二部分也是如此)。
  • [+\-]?\d+(?:.\d+)? 将匹配任何数字(带或不带小数)。

编辑:由于其他人提供了漂亮且易于查看的在线演示,here's mine

【讨论】:

  • 这很好。你能建议如何扩展它来处理数组值 [] 和 json 对象值 {}?
  • @OlegShirokikh 只需复制引号的子表达式以匹配相应的括号。但正如我所提到的,最好使用真正的 JSON 解析器来避免误解值引起的问题。
  • 谢谢 - 但这不会立即适用于嵌套的 json 对象 - 例如当值本身是包含在 {} 中的 json objs 时?我正在查看您的正则表达式 b/c 我有 JSON,其键未包含在双引号中,库无法解析。所以我的目标是用双引号将所有键括起来。我问了一个问题——但还没有一个好的解决方案——stackoverflow.com/questions/39928124/…。如果您能提供有关如何使用正则表达式 sol-n 解决此问题的提示,我将不胜感激!
  • @OlegShirokikh 这正是这种正则表达式方法导致的问题。从理论上讲,它可以扩展以适应这种情况,但它使整个事情变得非常复杂。仅供参考,未引用的键违反了标准,所以我猜你最好的选择是编写转换器/修复脚本或自己修改其中一个解析器。
【解决方案3】:

试试这个正则表达式:

text 最初匹配,因为它被视为键。

(\w+)\s*:\s*(["']).+\2,?

演示

http://regex101.com/r/zR3sT3

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 2017-03-20
    • 2018-03-09
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    相关资源
    最近更新 更多