【问题标题】:Regular Expressions: Using multiple lookbehinds to format blocks of JSON正则表达式:使用多个lookbehinds来格式化JSON块
【发布时间】:2021-11-09 00:30:42
【问题描述】:

注:这个问题纯粹是为了学习目的而提出的。我很清楚所提出的具体问题可以在任何现代代码编辑器中轻松解决。

我喜欢正则表达式的强大功能,但一直不太了解如何使用它们更高级的功能,尤其是外观。经过两个小时的 SO 搜索和谷歌搜索,加上使用 regexr.com,我想出了以下内容:

// Search regex: (?<=\[\n *\{\n)(?<= {4})(.*\n)*
// Replace regex: [{\n$&]

// Should take the following JSON object array:

[
    {
        "prop1": val1,
        "prop2": val2,
        // ...arbitrary number of props
    },
    // ...arbitrary number of objects matching the above structure
]

And format it like so:

[{ // first object's opening brace adjacent to opening bracket
    // ...first object's props
}, {
    // ...other objects' props
}] // last object's closing brace adjacent to closing bracket

第二个回顾是尝试去缩进每个道具线,以及关闭每个对象并打开下一个对象的线。但它似乎打破了整个事情。

没有它我会得到almost a perfect result,但是这些行没有缩进,并且最终对象的右大括号之后的换行符也被错误地匹配,就像这样(查看链接以获得更完整的示例):

[{
        "prop1": val1,
        "prop2: val2
    }, {
        "prop1": val1,
        "prop2: val2
    }
]

【问题讨论】:

    标签: javascript json regex


    【解决方案1】:

    对于您的具体输入,您可以删除所有匹配的

    /^    |(?<=\[)[ \n]*(?=\{)|(?<=\})[ \n]*(?=\])/gm
    

    RegExr link。或者,替换所有匹配的

    /^    |(\[)[ \n]*(\{)|(\})[ \n]*(\])/gm
    

    $1$2$3$4.

    但这只有在输入的格式与您的问题中显示的完全一致并且字符串(键或值)包含{时才有效。 “正则表达式的力量” 是一个很好的关键字,因为经典正则表达式缺乏处理任意嵌套大括号的能力。它们并非旨在像 JSON 那样处理 Type II grammars

    【讨论】:

    • 嗯,有趣!我从来没有想过从这个角度来解决问题,即删除想要的而不是保留的想要。不过我喜欢它!你刚刚给我上了宝贵的一课;再次TYSM:D
    • 实际上,再想一想,您的方法有 两个 关键区别:1. 我上面所说的和 2. 而不是尝试将整个数组匹配在一次,您只匹配 一行,然后对每一行重复该操作。非常聪明!从现在开始,我将在我编写的每个正则表达式中使用这两个关键思想:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2019-09-15
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多