Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有不同前缀和后缀表达式的共享子表达式的正则表达式更改_Javascript_Regex - Fatal编程技术网

Javascript 带有不同前缀和后缀表达式的共享子表达式的正则表达式更改

Javascript 带有不同前缀和后缀表达式的共享子表达式的正则表达式更改,javascript,regex,Javascript,Regex,我有下面的正则表达式,它有3种可选形式(参见下面的整个正则表达式),每个都有自己的前缀和后缀字符。我觉得这是重复过度,如果可能的话,我想简化。我正在匹配格式不正确的JSON字符串中的值,用索引键替换没有键的值 每个替换都应该与子表达式匹配前缀和后缀对。我现在有3双鞋,但这可能会改变。如果我有更多的对,整个正则表达式将成为一个噩梦,需要修改和理解,如果我需要修改重复的子表达式 问题 ("(?:[^\\"]+|\\.)*") 我如何缩短下面的整个正则表达式,而不需要为列出的后缀和前缀对重复子表达式

我有下面的正则表达式,它有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中的显式重复模式
    ((?:[^\\“]+\\\)*”

    脚本不支持所有相同的正则表达式功能PCRE(PHP、C++、Perl等)ReGEX引擎支持.< /P> 例如,在PHP/C++中,你可以这样做:

    {("(?:[^\\"]+|\\.)*")(?=,)|,((?1))(?=,)|,((?1))(?=})
    
    对于Perl 5.22,您需要再次转义
    {
    ,使其看起来像这样:

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

    这个
    (?1)
    是一个子例程调用,用于匹配捕获组
    1
    中的正则表达式,在本例中,它是
    ((?:[^\\”]+\\\)*”

    您可以将动态正则表达式构建与
    RegExp
    构造函数一起使用:声明
    ((?:[^\\”]+\\)*)
    作为构建块变量,然后在模式中重用它。不过,您必须将所有反斜杠加倍。如果我没有理解错,您可以使用单个表达式(多个)只需使用lookbefore和lookahead资源即可同时匹配所有部分。每个部分都使用多个备选方案来匹配每种情况下的有效定界字符。@我以前尝试过这种方法,但发现您无法在lookbehind中使用表达式,因此我必须对每次出现的情况进行硬编码。这仍然让我感到困惑我需要指定我想要的每个字符。因此,要么我必须使用javascript字符串生成我的正则表达式,要么我必须使用RegExp函数,它似乎就是这样做的。请看,其中的共识是“不,他们不应该”“!使用JavaScript,这是您所能做的最好的。在所有Perl派生的风格中,它是最有限的。您对针对其他风格的答案感兴趣吗?”?