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

空白が引用符内にある場合は、空白を無視するように調整する必要があります。したがって、コメンターの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 式です。

于 2013-08-13T09:06:17.777 に答える