空白が引用符内にある場合は、空白を無視するように調整する必要があります。したがって、コメンターの1人が示唆したように:
\s+ | ( " (?: [^"\\] | \\ . ) * " ) // White-space inserted for readability
Java 空白または二重引用符で囲まれた文字列に一致します。文字列は、"
エスケープなし、引用符なし、またはエスケープ + と任意の文字が続き、最後に"
. このように、文字列内の空白は一致しません。
$1 が null でない場合は $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 式です。