【发布时间】:2019-11-12 22:03:21
【问题描述】:
在将字符串解析为 JSON 之前,我需要从不需要的引号中清除字符串。该字符串看起来像一般的 JSON,有时在描述或其他字段中会有一些不需要的引号,例如
'{"description":"this is a long **"** description with strange quotes **"** like **"**","number":"111111111","quantity":"10","price":"5.20","unit":"ST **"** " }'
需要看起来像:
'{"description":"this is a long description with strange quotes like ","number":"111111111","quantity":"10","price":"5.20","unit":"ST" }'
我想出了以下正则表达式:
[\w\s\d](")[\w\s\d]
一个问题是正则表达式也匹配不需要的引号之前和之后的字符。所以用一个简单的字符串替换字符也会被替换。这是不想要的。它看起来像:
"{"description":"this is a longescription with strange quotes " like "","number":"111111111","quantity":"10","price":"5.20","unit":"ST"" }"
另一个问题是,只有第一次匹配,而不是每一次匹配。
有人可以帮忙吗?
编辑: 解决了!正确的正则表达式是
([\w\s])"(?=\w|(?!\s*[\]}])\s)
并使用替换语句:
string.replace(/([\w\s])"(?=\w|(?!\s*[\]}])\s)/g, "$1");
【问题讨论】:
-
你的做法可以表示为
s.replace(/([\w\s])"(?=[\w\s])/g, '$1') -
试试这样:
s.replace(/:\s*"(.*?)"(?=\s*[\]}])/g, function($0,$1) { return ':"' + $1.replace(/"/g, '') + '"'; }) -
好吧,也许是
s.replace(/([\w\s])"(?=\w|(?!\s*[\]}])\s)/g, '$1')? -
这就是我不喜欢这种方法的原因。试试full field matching approach。
-
然后发布并选择作为工作答案
标签: javascript jquery regex regex-lookarounds