Java 除了在json';谁的绳子?

Java 除了在json';谁的绳子?,java,regex,Java,Regex,我有如下指示: db.insert( { _id:3, cost:{_0:11}, description:"This is a description.\nCool, isn\'t it?" }); 我正在使用的Eclipse插件,叫做MonjaDB,将指令按换行分开,我将每一行作为单独的指令,这是不好的。我用电脑修复了它;(\r | \n)+现在包含整个指令,但是,在清理JSON各部分之间的换行时,它还清理JSON本身中字符串内的\n和\r 如何避免从JSON字符串

我有如下指示:

db.insert( {
    _id:3,
    cost:{_0:11},
    description:"This is a description.\nCool, isn\'t it?"
});
我正在使用的Eclipse插件,叫做MonjaDB,将指令按换行分开,我将每一行作为单独的指令,这是不好的。我用电脑修复了它;(\r | \n)+现在包含整个指令,但是,在清理JSON各部分之间的换行时,它还清理JSON本身中字符串内的\n和\r


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

当空格出现在引号内时,您需要安排忽略它,。正如其中一位评论者所说:

\s+ | ( "  (?: [^"\\]  |  \\ . ) * " )              // White-space inserted for readability
匹配java空格或双引号字符串,其中字符串由
后跟任何非转义、非引号或转义+加上任何字符组成,然后是最后一个
。这样,字符串中的空格就不匹配了

如果$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,并试用了我的解决方案。我的代码犯了几个错误,包括在模式中使用
\.
而不是
。因此,我已将其修复并在您的样本的变体上运行:

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表达式,在引号字符串外删除所有空格,在引号字符串内保留空格和换行符。

当空格出现在引号内时,您需要安排忽略它,。正如其中一位评论者所说:

\s+ | ( "  (?: [^"\\]  |  \\ . ) * " )              // White-space inserted for readability
匹配java空格或双引号字符串,其中字符串由
后跟任何非转义、非引号或转义+加上任何字符组成,然后是最后一个
。这样,字符串中的空格就不匹配了

如果$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,并试用了我的解决方案。我的代码犯了几个错误,包括在模式中使用
\.
而不是
。因此,我已将其修复并在您的样本的变体上运行:

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表达式,在引号字符串外删除所有空格,在引号字符串内保留空格和换行符。

您有几层困难:1-您想拆分而不是匹配2-JAVA只支持有限的lookbehinds 3-如果字符串中有转义的双引号或单引号呢?在我看来,你基本上是注定要失败的。你需要一个合适的解析器。@HamZa不替换字符串中的内容实际上有点简单,并不需要无限查找。您只需匹配空格和字符串,如
\s |(stringRegex)
,并替换为
$1
@m.buettner,但他正在拆分,而不是替换。@HamZa对我来说,这听起来像是从拆分中分离出来的一个过程。是的,第一步是拆分DB命令,我可以保证;他们之间至少有一条新线。嘿,我可以用#@$替换json字符串中的内容吗?然后拆分\r\n,然后将#@$还原回来!但是如何检测json字符串中的\r\n\t呢?您有几层困难:1-您想拆分而不是匹配2-JAVA只支持有限的lookbehind 3-如果字符串中有转义的双引号或单引号呢?在我看来,你基本上是注定要失败的。你需要一个合适的解析器。@HamZa不替换字符串中的内容实际上有点简单,并不需要无限查找。您只需匹配空格和字符串,如
\s |(stringRegex)
,并替换为
$1
@m.buettner,但他正在拆分,而不是替换。@HamZa对我来说,这听起来像是从拆分中分离出来的一个过程。是的,第一步是拆分DB命令,我可以保证;他们之间至少有一条新线。嘿,我可以用#@$替换json字符串中的内容吗?然后拆分\r\n,然后将#@$还原回来!但是如何检测json字符串中的\r\n\t?或者更好的方法是使用
\s+/code>@AnttiHaapala:
\s+
的好主意,我希望我已经修复了转义错误。很难说有这么多的背部割伤!第一个引号字符为未换格字符,第二个引号字符为missing@AnttiHaapala:是的,我发现在没有Java IDE为我完成所有工作时,很难确保语法正确。只有我的平板电脑和它的狡猾的键盘可以在json的各个部分之间\r\n进行清理?或者更好,使用
\s+
@AnttiHaapala:关于
\s+
的好主意,我希望我已经修复了转义错误。很难说有这么多的背部割伤!第一个引号字符为未换格字符,第二个引号字符为missing@AnttiHaapala:是的,我发现在没有Java IDE为我完成所有工作时,很难确保语法正确。只有我的平板电脑和它狡猾的键盘,这会在json的各个部分之间\r\n进行清理吗?