当空格出现在引号中时,您需要安排忽略空格。正如其中一位评论者所建议的那样:
\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 表达式,在引用的字符串之外删除了所有空格,在引用的字符串中保留了空格和换行符。