考虑以下示例
<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)
但我没有弄清楚如何将正则表达式aaaaaa
或bbbbbbb
取决于其在第一个操作参数中的位置,该参数现在已固定为aaaaaa
且应为bbbbbbb
对于y或z
答案 0 :(得分:-1)
如果您愿意,可以在两步正则表达式中执行此操作:
[^"]*"((?:[^\\"]|\\.)*)"\s*:\s*{(.*)}
你的奇怪的比赛是你的关键,你的偶数比赛是你的价值观。您需要在偶数匹配项上运行辅助正则表达式才能找到所有值,例如:
[^"]*"((?:[^\\"]|\\.)*)"\s*:\s*(?:true|false)
哪个应提取所有值。
修改强>
只有一个正则表达式无法实现这一点,这就是为什么,如果你用引号捕获每个变量,你最终会得到6个捕获:
- CCCCCC
- AAAAAA
- XXXXXXXX
- BBBBBBB
- YYYYY
- zzzzzzzz
醇>
如果没有对输入进行目视检查,完全不清楚这些是什么。定义另一个变量所包含的变量的唯一方法是仅提取变量名称,然后只有米中给出的内容定义了捕获的内容。我的第一次捕获会给你:
- CCCCCC
- AAAAAA
- &#34; xxxxxxxx&#34;:true
- BBBBBBB
- &#34; yyyyy&#34;:true,&#34; zzzzzzzz&#34;:true
醇>
JavaStript does not currently support repetitive captures.但即使它确实考虑过将我的两个正则表达式合二为一的复杂性:
[^"]*"((?:[^\\"]|\\.)*)"\s*:\s*{((?:[^"]*"((?:[^\\"]|\\.)*)"\s*:\s*{(.*)})*)}
您最终会得到以下匹配:
- CCCCCC
- AAAAAA
- &#34; xxxxxxxx&#34;:true
- XXXXXXXX
- BBBBBBB
- &#34; yyyyy&#34;:true,&#34; zzzzzzzz&#34;:true
- YYYYY
- zzzzzzzz
醇>
您必须处理整套捕获,将捕获标识为内容。您可以通过查找任何空捕获或包含'"'
字符的任何捕获来实现此目的。然后你可以假设紧接在内容捕获之前的每个变量都是一个包含变量,并且在捕获内容之后的每个变量都是一个包含变量;直到下一个包含变量。
当然,除了创建大量额外的工作之外,正如我所链接的那样,目前在JavaScript正则表达式中还没有。因此,我将回到我原来的答复声明:由于Bergi mentioned避免使用正则表达式来支持程序化解决方案JSON.parse
或类似方法,因为它的脆弱性应该始终是首选正则表达式。