选择引号之间的内部引号

时间:2017-06-08 14:32:02

标签: javascript regex

我想知道你是否可以帮我找出正则表达式以匹配引号之间的内部引号。

我的问题是我有一个看似

的无效JSON文件
{
   "name" : "some "name" here",
   "lastName" : "some "lastname" here"
}

正如您可能会注意到内部双引号未被转义,并且我有一个包含数百条记录的数组,其中一些有问题。 (我知道无法读取无效的JSON,所以我使用Node中的fs来获取JSON文件的字符串版本)

fs.readFileSync('./bigJSON.json','utf8')

我制作了这个正则表达式

/(?:\w\s)\".*\"(?:\s\w)/g

匹配(e"名称" h)和(e"姓氏" h)。 我想知道是否有办法只针对嵌套引号(")。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题在于正则表达式并不擅长发现未知数量的东西。

这将使用负面的lookbehinds在带引号的字符串中找到前两个未转义的引号

\"(?<!\\).*(\"(?<!\\)).*(\"(?<!\\)).*\"(?<!\\)

其中两个捕获组包含违规的未转义引号。

是一个稍微安全的版本
\"(?<!\\).*\"(?<!\\) : \"(?<!\\).*(\"(?<!\\)).*(\"(?<!\\)).*\"(?<!\\),?(?:\n|\r|\r\n)

但要求您的数据相当一致。这可以多次运行,删除找到的违规报价,直到找不到更多。

我建议最好的方法是以编程方式,因为正则表达式并不擅长这一点,可能就像逐个字符地读取文件一样。

<强>更新 刚刚注意到你使用的是Javascript。根据{{​​3}},Javascript不支持正面或负面的lookbehinds,虽然您应该在需要之前更正文件一次,因此可以使用任何语言。