Regex更改,带有不同前缀和后缀表达式的共享子表达式

Regex alteration with shared sub expression with different prefix and suffix expressions

本文关键字:表达式 后缀 共享 前缀 更改 Regex      更新时间:2023-09-26

我有下面的正则表达式,它有3个替换项(请参见下面的整个正则表达式),每个正则表达式都有自己的前缀和后缀字符。我觉得这重复得太多了,如果可能的话,我想简化一下。我正在匹配格式不正确的JSON字符串中的值,以将没有键的值替换为索引键。

每个替换都应该将前缀和后缀对与子表达式相匹配。我现在有三双,但可能会改变。如果我有更多的对,那么整个正则表达式将变成一场噩梦,如果我需要修改重复的子表达式,我就会明白。

问题

如何缩短下面的整个正则表达式,而不需要为列出的后缀和前缀对重复子表达式

子表达式,在每次交替中重复

("(?:[^''"]+|''.)*")

前缀/后缀对

  1. {
  2. ,}

整Regex

/'{("(?:[^''"]+|''.)*")(?=,)|,("(?:[^''"]+|''.)*")(?=,)|,("(?:[^''"]+|''.)*")(?='})/g

测试字符串

  • {"trailer":"","pallet":"A","date":"11-Dec-15","c","z","a"}
  • {"trailer":"","pallet":"A","a","date":"11-Dec-15"}
  • {"a","trailer":"","pallet":"A","date":"11-Dec-15"}
  • {"a","trailer":"","pallet":"A","date":"11-Dec-15","z'""}
  • {"trailer":"","pallet":"A","11-Dec-15"}
  • {"trailer'"","pallet":"A","11-Dec'"-15","z'""}

实际示例

请将答案限制在regex替换而不是JSON验证技术上,因为我正试图更好地理解regex,这只是我使用的示例。

虽然正则表达式可以简化为:

/'{("(?:[^''"]+|''.)*")(?=,)|,("(?:[^''"]+|''.)*")(?=,)|,("(?:[^''"]+|''.)*")(?='})/g

收件人:

/{("(?:[^''"]+|''.)*")(?=,)|,("(?:[^''"]+|''.)*")(?=,)|,("(?:[^''"]+|''.)*")(?=})/g

删除{}的转义,因为JavaScript的正则表达式引擎不需要它。

这是不可能在JavaScript中删除显式重复模式("(?:[^''"]+|''.)*")的。

JavaScript不支持正则表达式引擎支持的所有基于PCRE(PHP、C++、Perl等)的正则表达式功能。

例如,在PHP/C++中,您可以这样做:

{("(?:[^''"]+|''.)*")(?=,)|,((?1))(?=,)|,((?1))(?=})

对于Perl5.22,您需要再次转义{,所以它看起来像这样:

m/'{("(?:[^''"]+|''.)*")(?=,)|,((?1))(?=,)|,((?1))(?=})/g

(?1)是一个子程序调用,用于匹配捕获组1内的正则表达式,在本例中,该捕获组为("(?:[^''"]+|''.)*")