javascript - 具有不同前缀和后缀表达式的共享子表达式的正则表达式更改

标签 javascript regex

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

每个交替都应匹配前缀和后缀对与子表达式。我现在有 3 双,但这可能会改变。如果我有更多对,那么整个正则表达式将成为修改和理解我是否需要修改重复的子表达式的噩梦。

问题

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

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

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

前缀/后缀对
  • { ,
  • , ,
  • , }

  • 整个正则表达式
    /\{("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=\})/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\""}

  • Live Example

    请限制对正则表达式替代而不是 JSON 验证技术的答案,因为我试图更好地理解正则表达式,这只是我使用的示例。

    最佳答案

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

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

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

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

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

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

    例如,在 PHP/C++ 中,您可以这样做:
    {("(?:[^\\"]+|\\.)*")(?=,)|,((?1))(?=,)|,((?1))(?=})
    

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

    这个(?1)是一个子程序调用来匹配捕获组内的正则表达式 1在这种情况下是 ("(?:[^\\"]+|\\.)*") .

    关于javascript - 具有不同前缀和后缀表达式的共享子表达式的正则表达式更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34223605/

    相关文章:

    javascript - 尽管局部变量在变化,但全局变量的值没有变化

    javascript - jquery/js 错误 - DOM 错误 : DOM Exception 8 - When I . html 任何变量

    javascript - 在req.body中使用变量

    javascript - 在 javascript 中定义一个 shadow DOM 模板

    javascript - 正则表达式:匹配字符并将其从结果中排除?

    javascript - 自定义事件外观主界面时间表

    php - 找到一定的空白?

    regex - 在 OS X 上 sed - 似乎无法在正则表达式中使用 +

    python - 使用python和regex删除字符串中字符串之间的所有xml标签

    php - 从短语中删除单词并在单词之间只留下一个空格