想知道是否可以使用正则表达式

时间:2015-06-15 00:41:23

标签: javascript regex

考虑以下示例

<pre>
    {
      "cccccc": {},
      "aaaaaa": {
        "xxxxxxxx": true
      },
      "bbbbbbb": {
        "yyyyy": true,
        "zzzzzzzz": true
      }
    }
</pre>

我可以选择x y和z并为它们分配动作功能

re = /"(.*?)(": (true|false))/g
hl = '"<span style="color:blue;" onclick="action(\'aaaaaa\',\'$1\')">$1</span>$2';
s = s.replace(re, hl)

但我没有弄清楚如何将正则表达式aaaaaabbbbbbb取决于其在第一个操作参数中的位置,该参数现在已固定为aaaaaa且应为bbbbbbb对于y或z

1 个答案:

答案 0 :(得分:-1)

如果您愿意,可以在两步正则表达式中执行此操作:

[^"]*"((?:[^\\"]|\\.)*)"\s*:\s*{(.*)}

你的奇怪的比赛是你的关键,你的偶数比赛是你的价值观。您需要在偶数匹配项上运行辅助正则表达式才能找到所有值,例如:

[^"]*"((?:[^\\"]|\\.)*)"\s*:\s*(?:true|false)

哪个应提取所有值。

修改

只有一个正则表达式无法实现这一点,这就是为什么,如果你用引号捕获每个变量,你最终会得到6个捕获:

  
      
  1. CCCCCC
  2.   
  3. AAAAAA
  4.   
  5. XXXXXXXX
  6.   
  7. BBBBBBB
  8.   
  9. YYYYY
  10.   
  11. zzzzzzzz
  12.   

如果没有对输入进行目视检查,完全不清楚这些是什么。定义另一个变量所包含的变量的唯一方法是仅提取变量名称,然后只有米中给出的内容定义了捕获的内容。我的第一次捕获会给你:

  
      
  1. CCCCCC
  2.   

  3.   
  4. AAAAAA
  5.   
  6. &#34; xxxxxxxx&#34;:true
  7.   
  8. BBBBBBB
  9.   
  10. &#34; yyyyy&#34;:true,&#34; zzzzzzzz&#34;:true
  11.   

JavaStript does not currently support repetitive captures.但即使它确实考虑过将我的两个正则表达式合二为一的复杂性:

[^"]*"((?:[^\\"]|\\.)*)"\s*:\s*{((?:[^"]*"((?:[^\\"]|\\.)*)"\s*:\s*{(.*)})*)}

您最终会得到以下匹配:

  
      
  1. CCCCCC
  2.   

  3.   
  4. AAAAAA
  5.   
  6. &#34; xxxxxxxx&#34;:true
  7.   
  8. XXXXXXXX
  9.   
  10. BBBBBBB
  11.   
  12. &#34; yyyyy&#34;:true,&#34; zzzzzzzz&#34;:true
  13.   
  14. YYYYY
  15.   
  16. zzzzzzzz
  17.   

您必须处理整套捕获,将捕获标识为内容。您可以通过查找任何空捕获或包含'"'字符的任何捕获来实现此目的。然后你可以假设紧接在内容捕获之前的每个变量都是一个包含变量,并且在捕获内容之后的每个变量都是一个包含变量;直到下一个包含变量。

当然,除了创建大量额外的工作之外,正如我所链接的那样,目前在JavaScript正则表达式中还没有。因此,我将回到我原来的答复声明:由于Bergi mentioned避免使用正则表达式来支持程序化解决方案JSON.parse或类似方法,因为它的脆弱性应该始终是首选正则表达式。