在JSON文件中使用正则表达式查找和替换引号内的引号

时间:2013-01-23 13:43:59

标签: javascript json

我有一个非常大的JSON文件,有近30000条记录。 一条记录看起来像这样:

{
  "adlibJSON": {
    "recordList": {
      "record": [
        {
          "@attributes": {
            "priref": "4372",
            "created": "2011-12-09T23:09:57",
            "modification": "2012-08-11T17:07:51",
            "selected": "False"
          },
          "acquisition.date": [
            "1954"
          ],
          "documentation.title": [
            "A lot of text with a lot of extra double quotes like "this" and "this""
          ] ... ...

问题在于有很多带有额外双引号的值。这可以是1双引号,但也可以是2或3个额外的双引号。请参阅我的示例中"documentation.title"的值。

如何找到所有这些引号并用正则表达式替换它们。 我使用sublime text 2来做我的正则表达式,但我不知道如何解决这个特定的问题。

2 个答案:

答案 0 :(得分:1)

以下是两个例子:

这些要求具有以下要求:

  • 值不以逗号,冒号,右括号或空格开头。

否则你必须改进它。第二个甚至允许值以空格开头,但也可能有其他一些副作用......

示例1:

\"[A-Za-z0-9][^"]+\"\s*[^,:}\s]

示例2:

\"([A-Za-z0-9\s][^"]+\"\s*[^,:\]}\s]){2}

答案 1 :(得分:0)

如果您有机会使用PHP,并且您可以确保JSON文件将与PRETTY_PRINT一起提供(与您的示例输出中分隔的行)...您可以创建一个PHP文件,您将向其发送文件名和得到纠正的输出。这是一个例子。

header('Content-Type: application/json');

$file = @trim($_GET['file']);
if (empty($file) || ($contents = @file_get_contents($file)) === FALSE) {
    // handle errors here
    echo json_encode(array('error'=>'Invalid file!'));
    exit;
}
function escapeQuotes($m) {
    return $m[1].$m[2].preg_replace('~(?<!\\\\)(?<!^)"(?!$)~','\\"',$m[3]).$m[4];
}
$res = preg_replace_callback(
    '~^(\s*)("[^"\s]+"\s*:\s*)?(".*")(,?\s*)$~m',
    'escapeQuotes',$contents
);
echo json_encode(json_decode($res,true));