我有一个像这样的“ json”:
{
example:"hi there",
dateTime: "01/01/1970 bla:bla"
}
在冒号将它们括在双引号之前,我应该替换所有值。
参考此响应Regex in ruby to enclose word before : with double quotes,我尝试了代码,但尚未完全正确,因为它也更改了dateTime中冒号之前的值。
所以我应该添加此代码
(\w+)(?=:)
另一个控件,可以查看单词是否在逗号之后。
我想将“ json”更改为这样的真实json:
{
"example":"hi there",
"dateTime": "01/01/1970 bla:bla"
}
而不像现在这样:
{
"example":"hi there",
"dateTime": "01/01/1970 "bla":bla"
}
答案 0 :(得分:2)
这里是选择所有属性并替换(检查演示)的解决方案:
对于所有大小写字母:
/(?:[a-z]+(?=:[" ]))/ig
对于字母数字和下划线:
/(?:[\w]+(?=:[" ]))/g
演示:
https://www.regextester.com/?fam=107535
?:
用于创建组,而无需反向引用。因此,提高了计算速度,因为它不必记住该组以供重用。
答案 1 :(得分:1)
如果您可以像在示例中那样依靠行首处要替换的值的位置,则可以使用^ +([a-zA-Z0-9_]*):
之类的正则表达式,该正则表达式仅与字母数字字符的序列和在冒号前加下划线,并在零或多个空格之前加上,并将该序列捕获为第一组。
您可以使用online regex validator查看与显示的输入样本相匹配/捕获的内容,以及与之匹配的内容。
然后,您可以使用捕获的组将您感兴趣的文本用双引号引起来。
JS中简单的可运行示例:
var input = `{
example:"hi there",
dateTime: "01/01/1970 bla:bla"
}`
var regexp = /^[ \t]+([a-zA-Z0-9_]*):/mg
var replaced = input.replace(regexp, '"$1":')
console.log(replaced)
EXPLANATION:m
标志启用多行匹配,g
标志启用全部匹配模式
我无法向您展示Ruby示例,但是提供的regexpr应该可以为您提供帮助!
答案 2 :(得分:0)
您的模式(\w+)(?=:)
与1+个单词字符匹配,其中右侧是一个冒号。那将匹配bla:
您可能要做的是扩展正向查找以匹配一个单词字符\w+
的1+倍,然后使用正向查找来断定右边的是冒号,然后是双引号,匹配的是在中间,并以双引号引起来。
请注意,匹配项不同于任何数据结构,并且取决于匹配项右侧的内容。
然后在替换中,您可以将引号引起来。
\w+(?=:\s*"[^"]+")
符合条件的人
\w+
匹配1个以上的单词字符(?=
积极向前看,以断言正确的匹配项
\s*
匹配0+次空格字符*"[^"]*"
使用否定的字符类进行匹配,从开始将关闭引号及其之间的内容。)
提前关闭