使用正则表达式从文件中提取 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 对象