0

我有这样的指令:

db.insert( {
    _id:3,
    cost:{_0:11},
    description:"This is a description.\nCool, isn\'t it?"
});

我正在使用的名为 MonjaDB 的 Eclipse 插件通过换行符分割指令,我将每一行作为单独的指令,这很糟糕。我使用 ;(\r|\n)+ 修复了它,它现在包含整个指令,但是,在清理 JSON 各部分之间的换行符时,它还会清理 json 本身字符串中的 \n 和 \r。

如何避免从 JSON 字符串中删除 \t、\r、\n?当然,它们由“”或“”分隔。

4

1 回答 1

3

当空格出现在引号中时,您需要安排忽略空格。正如其中一位评论者所建议的那样:

\s+ | ( "  (?: [^"\\]  |  \\ . ) * " )              // White-space inserted for readability

匹配 java 空格或双引号字符串,其中字符串由"后跟任何非转义、非引号或转义 + 加上任何字符,然后是 final组成"。这样,字符串中的空格不匹配。

如果 $1 不为空,则替换为 $1。

    Pattern clean = Pattern.compile(" \\s+ | ( \" (?: [^\"\\\\] | \\\\ . ) * \" ) ", Pattern.COMMENTS | Pattern.DOTALL);

StringBuffer sb = new StringBuffer();
Matcher m = clean.matcher( json );
while (m.find()) {
    m.appendReplacement(sb, "" );
    // Don't put m.group(1) in the appendReplacement because if it happens to contain $1 or $2 you'll get an error.
    if ( m.group(1) != null )
        sb.append( m.group(1) );
}
m.appendTail(sb);

String cleanJson = sb.toString();

这完全不在我的脑海中,但我很确定它接近你想要的。

编辑:我刚刚可以访问 Java IDE 并尝试了我的解决方案。我在代码中犯了几个错误,包括在 Pattern 中使用\.而不是。.所以我已经修复了它并在你的样本的变体上运行它:

db.insert( {
    _id:3,
    cost:{_0:11},
    description:"This is a \"description\" with an embedded newline: \"\n\".\nCool, isn\'t it?"
});

编码:

    String json = "db.insert( {\n" +
            "    _id:3,\n" +
            "    cost:{_0:11},\n" +
            "    description:\"This is a \\\"description\\\" with an embedded newline: \\\"\\n\\\".\\nCool, isn\\'t it?\"\n" +
            "});";

        // insert above code

        System.out.println(cleanJson);

这会产生:

db.insert({_id:3,cost:{_0:11},description:"This is a \"description\" with an embedded newline: \"\n\".\nCool, isn\'t it?"});

这是相同的 json 表达式,在引用的字符串之外删除了所有空格,在引用的字符串中保留了空格和换行符。

于 2013-08-13T09:06:17.777 回答