我有下面的正则表达式,它有 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\""}
请限制对正则表达式交替的回答,而不是 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/