REGEX-如何用冒号本身替换成双引号来替换冒号之前的词

时间:2019-02-07 09:36:29

标签: regex replace

我有一个像这样的“ 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"
}

3 个答案:

答案 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+次空格字符
    • *"[^"]*"使用否定的字符类进行匹配,从开始将关闭引号及其之间的内容。
  • )提前关闭

Regex demo | Example using Ruby