给定以下json字符串:{"key":"val"ue","other":"invalid ""quo"te"}
我想捕获值中的每个非法双引号.在该示例中,Key属性的值中有一个双引号,而名为Other的属性中有三个双引号.
我看到了许多 comments ,指出这是无效的json(正确),并且提供的json在接收之前应该是有效的.然而,在我的情况下,这是不可能的.
假设这只会出现在值中,而不会出现在键中,我认为可以安全地假设开始序列将是一个冒号后跟一个双引号. 结束序列将是一个双引号,后跟逗号或右大括号.
我try 了以下正则表达式(在许多其他版本中),它是最接近的,因此是我想要的解决方案:
/:\s?".*?(").*?[,}]/i
个
这正确地捕获了Key属性中的一个双引号,但只捕获了‘Other’属性中的第一个双引号. 我希望它捕获其他两个双引号以及一个单独的捕获.
我试过的另一个正则表达式:/:\s?".*?("{1,})[^,}].*?[,}]/i
这与第一个正则表达式的作用相同,但在一次捕获中捕获了两个双引号(不可取)
我的最终目标是分别捕获每个双引号,所以有四个捕获.我认为,要做到这一点,我需要的是一种让被捕者变得"贪婪"的方法.这样它就不会止步于第一个双引号.
我怎么才能做到这一点呢?
我正在使用以下PHP代码测试Regex:
$text = '{"key":"val"ue","other":"invalid ""quo"te"}';
$pattern = '/:\s?".*?(").*?[,}]/i';
preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE);
echo '<pre>' . print_r($matches, true) . '</pre>';