使用正则表达式从文件中提取 JSON 键值映射

Posted

技术标签:

【中文标题】使用正则表达式从文件中提取 JSON 键值映射【英文标题】:Extract JSON key-value map with a regex from a file 【发布时间】:2017-10-12 22:40:20 【问题描述】:

我在正则表达式方面并不是很强大,并试图用我自己的自行车手工编写的解析器来解决一个问题,但它在一些我无法预料的输入上失败了,问题如下:我有 javascript i18n 文件,连同翻译,包含一些可能在文件中某处定义的其他配置内容(这是使用手工解析器很难处理问题的主要原因),所以文件是这样的:

(function() 
    'use strict';
    //some configuration stuff (some other stuff may be insterted)
    var translations = angular.module('module.translations.languages.enUs', []);

    translations.constant('translationsName', 
     "first_label":"first_label_value",
     "second_label":"second_label_value"
     //etc
);

());

上面的例子只是可能的模板选项之一,但它们都有一个共同点——翻译标签被定义为一个键值 json,它只不过是一个序列化为 json 的 java map。 我的目标是只从文件中获取这些键值 json,将其反序列化为映射,对其进行一些操作并再次将其插入。所以问题是:也许有人已经准备好并且经过验证的正则表达式可以处理这种情况 - 在文本中找到键值 json 的映射?如果是这样,我将非常感激! 谢谢, 干杯, 安德烈

【问题讨论】:

【参考方案1】:

您可以使用此正则表达式来查找 "key":"value" 对:

"([^"]+)"\s*:\s*"([^"]+)",?

Group 1 是键,Group 2 是值

它还会找到 "key": "value""key" :"value""key" : "value" 对。

Demo on regexplanet(点击Java按钮,然后点击Test按钮)

在 regex101 上也是 demo

说明

"([^"]+)" :捕获除双引号之间的双引号以外的任何字符(这是

\s*? : 后跟零个或多个空格

\s* : 后跟一个冒号

\s* : 后跟零个或多个空格

"([^"]+)" :捕获除双引号之间的双引号以外的任何字符(这是

【讨论】:

我有类似的问题。我用了你的正则表达式,它对我有用。谢谢。 太棒了!感谢您的反馈。 在值是数字时遇到问题,因此没有双引号? 已经接近了以下正则表达式:("([^"]+)"\s*:\s*"([^"]+)")|("([^"]+)"\s*:\s*(\d+\.?\d*))|("([^"]+)"\s*:\s*(\w+)) 但这不能处理任何重叠,例如"list":"\"num\":"\1\" , 仅返回:"list":"\" 嗨@MetricRat,用(?:"([^"]+)"|(\d+)) 替换第二组捕获"([^"]+)" 应该会回答您的请求。这是一个例子:regex101.com/r/bRacQh/2

以上是关于使用正则表达式从文件中提取 JSON 键值映射的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 正则表达式从 html 中提取 JSON 对象

如何使用正则表达式从 JSON 结构中提取子节点?

什么时间用正则表达式什么时间用json提取器

C#正则表达式提取多个结构键值

Oracle 使用带有 oracle regexp_substr 的正则表达式提取 json 字段

性能测试五:jmeter进阶之后置处理器(正则json提取器)