正则表达式删除 json 属性

Regex remove json property

我想根据它的键删除字符串化 json 的 属性,无论它在哪里,无论它的值类型是什么。但是只有当它的值是一个字符串并且它位于对象的根级别时才删除它对于开始是很好的。我试过这个:

[,]{1}[\s]*?\"attrName\"[ ]*?[:][ ]*?\".*\"[^,]|\"attrName\"[ ]*?[:][ ]*?\".*\"[,]{0,1}

示例:https://regex101.com/r/PAlqYi/1

但是做这样一个简单的工作看起来很大,它所做的是确保逗号也将被删除,如果 attrName 是第一个属性,最后一个在 [=20 中间的东西=] 三。有没有人有更好的主意来使这个正则表达式更具可读性?

如果您有任何使用解析器的方法,那将是一个更稳定和可读性更高的解决方案。正则表达式 \s*\"attr\" *: *\".*\"(,|(?=\s*\})) 应该更短更好。

Example

我为帮助所做的几项更改:

  1. 不要使用像 [,] 这样的 class 字符。如果一个字符中只有一个元素class,它应该自己留下。
  2. 仅在需要时使用编号计数。例如:{0,1}?{1} 毫无意义。
  3. 而不是在上一行中搜索逗号以查看它是否是列表的末尾,检查行后是否有 } 允许您将条件组合在一起。
  4. 在搜索 } 的末尾使用正向前瞻,因此它不会在替换过程中被删除。

更新评论中提到的错误修正。如果该属性是最后一个,则将保留尾随逗号。我发现解决此问题的最简单方法是匹配这两种情况。所以,你必须填写 attr 两次。

(,\s*\"attr\" *: *\".*\"|(?=\s*\}))|(\s*\"attr\" *: *\".*\"(,|(?=\s*\})))

Examples with added tests cases

我修改了第一个示例中的正则表达式,即使是 Flat 也能更好地工作 JSON

\s*\"attr\" *: *(\"(.*?)\"(,|\s|)|\s*\{(.*?)\}(,|\s|))

Example