Javascript 带有不同前缀和后缀表达式的共享子表达式的正则表达式更改
我有下面的正则表达式,它有3种可选形式(参见下面的整个正则表达式),每个都有自己的前缀和后缀字符。我觉得这是重复过度,如果可能的话,我想简化。我正在匹配格式不正确的JSON字符串中的值,用索引键替换没有键的值 每个替换都应该与子表达式匹配前缀和后缀对。我现在有3双鞋,但这可能会改变。如果我有更多的对,整个正则表达式将成为一个噩梦,需要修改和理解,如果我需要修改重复的子表达式 问题Javascript 带有不同前缀和后缀表达式的共享子表达式的正则表达式更改,javascript,regex,Javascript,Regex,我有下面的正则表达式,它有3种可选形式(参见下面的整个正则表达式),每个都有自己的前缀和后缀字符。我觉得这是重复过度,如果可能的话,我想简化。我正在匹配格式不正确的JSON字符串中的值,用索引键替换没有键的值 每个替换都应该与子表达式匹配前缀和后缀对。我现在有3双鞋,但这可能会改变。如果我有更多的对,整个正则表达式将成为一个噩梦,需要修改和理解,如果我需要修改重复的子表达式 问题 ("(?:[^\\"]+|\\.)*") 我如何缩短下面的整个正则表达式,而不需要为列出的后缀和前缀对重复子表达式
("(?:[^\\"]+|\\.)*")
我如何缩短下面的整个正则表达式,而不需要为列出的后缀和前缀对重复子表达式
子表达式,在每次交替中重复
("(?:[^\\"]+|\\.)*")
前缀/后缀对
/\{("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=\})/g
测试字符串
{“拖车”:“托盘”:“A”,“日期”:“15年12月11日”,“c”,“z”,“A”}
{“拖车”:“托盘”:“A”、“A”、“日期”:“2015年12月11日”}
{“a”,“拖车”:“托盘”:“a”,“日期”:“2015年12月11日”}
{“a”,“拖车”:“托盘”:“a”,“日期”:“2015年12月11日”,“z\”}
{“拖车”:“托盘”:“A”,“2015年12月11日”}
{“拖车”、“货盘”:“A”、“12月11日”-15”、“z\”}
请将答案限制在正则表达式替换,而不是JSON验证技术,因为我正试图更好地理解正则表达式,这只是我使用的示例。而正则表达式可以从以下方面简化:
/\{("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=\})/g
致:
删除{
和}
的转义,因为JavaScript的正则表达式引擎不需要转义
这意味着无法删除JavaScript中的显式重复模式((?:[^\\“]+\\\)*”
{("(?:[^\\"]+|\\.)*")(?=,)|,((?1))(?=,)|,((?1))(?=})
对于Perl 5.22,您需要再次转义{
,使其看起来像这样:
m/\{("(?:[^\\"]+|\\.)*")(?=,)|,((?1))(?=,)|,((?1))(?=})/g
这个
(?1)
是一个子例程调用,用于匹配捕获组1
中的正则表达式,在本例中,它是((?:[^\\”]+\\\)*”
您可以将动态正则表达式构建与RegExp
构造函数一起使用:声明((?:[^\\”]+\\)*)
作为构建块变量,然后在模式中重用它。不过,您必须将所有反斜杠加倍。如果我没有理解错,您可以使用单个表达式(多个)只需使用lookbefore和lookahead资源即可同时匹配所有部分。每个部分都使用多个备选方案来匹配每种情况下的有效定界字符。@我以前尝试过这种方法,但发现您无法在lookbehind中使用表达式,因此我必须对每次出现的情况进行硬编码。这仍然让我感到困惑我需要指定我想要的每个字符。因此,要么我必须使用javascript字符串生成我的正则表达式,要么我必须使用RegExp函数,它似乎就是这样做的。请看,其中的共识是“不,他们不应该”“!使用JavaScript,这是您所能做的最好的。在所有Perl派生的风格中,它是最有限的。您对针对其他风格的答案感兴趣吗?”?