こんにちは、みんな。
Javaでフォーマットを指定せずにいくつかの文字列を連結したい。たとえば、signature、BigInteger、stringなどの複数のオブジェクトを連結して、それらすべてをstringに変換したいとします。したがって、各区切り文字がこれらの文字列に存在する可能性があるため、指定された区切り文字を使用できません。これらの文字列を連結してから分割するにはどうすればよいですか?
皆さんありがとう。
3 に答える
XMLやJSONなどの明確に定義された形式を使用します。または、区切り文字を選択して、各文字列内のこの区切り文字のすべてのインスタンスをエスケープします。または、メッセージの各部分の長さを前に付けます。例えば:
10/7/14-<10 chars of signature><7 chars of BigInteger><14 chars of string>
また
10-<10 chars of signature>7-<7 chars of BigInteger>14-<14 chars of string>
文字列の区切り文字をエスケープできます。たとえば、次の文字列があるとします。
String a = "abc;def";
String b = "12345:";
String c = "99;red:balloons";
あなたはこのようなことをしたい
String concat = a + delim + b + delim + c;
String[] tokens = concat.split(delim);
しかし、";"
デリミタが非常に明確である場合、3つではなく5つのトークンがあるため、これでは不十分です。可能な区切り文字のセットを使用し、文字列でそれらの区切り文字を検索してから、そうでない最初の区切り文字を使用できます。ターゲット文字列にありますが、これには2つの問題があります。まず、どの区切り文字が使用されたかをどのようにして知ることができますか?次に、すべての区切り文字が文字列に存在する場合はどうなりますか?これは有効な解決策ではなく、確かに堅牢ではありません。
エスケープ区切り文字を使用すると、これを回避できます。":"
エスケープ区切り文字として使用しましょう。これを使用して、「次の文字は通常の古い文字であり、重要なことは何も意味しません」と言うことができます。
したがって、これを行った場合:
String aEscaped = a.replace(";",":;");
String bEscaped = b.replace(";",":;");
String cEscaped = c.replace(";",":;");
次に、連結された文字列を次のように分割できます
String tokens = concat.split("[^:];")
しかし、1つの問題があります。テキストに実際に含まれている":;"
、またはで終わっている場合はどうなり":"
ますか?いずれにせよ、これらは誤検知を生成します。この場合、エスケープ文字もエスケープする必要があります。基本的には前と同じことを言っています:「次のキャラクターは特別なことは何もしません」。
したがって、エスケープされた文字列は次のようになります。
// note we escape our escape token first, otherwise we'll escape
// real usages of the token
String aEscaped = a.replace(":","::").replace(";",":;");
String bEscaped = b.replace(":","::").replace(";",":;");
String cEscaped = c.replace(":","::").replace(";",":;");
そして今、正規表現でこれを説明する必要があります。誰かがこれに有効な正規表現を知っている場合は、自由に編集できます。私に起こることは、次のようなものconcat.split("(::;|[^:];)")
ですが、仕事が完了していないようです。それを解析する作業は非常に簡単です。私はそれのために小さなテストドライバーを一緒に投げました、そしてそれはうまくいくようです。
http://ideone.com/wUlyzにあるコード
結果:
abc;def becomes abc:;def
ja:3fr becomes ja::3fr
; becomes :;
becomes
: becomes ::
83;:;:;;;; becomes 83:;:::;:::;:;:;:;
:; becomes :::;
Final product:
abc:;def;ja::3fr;:;;;::;83:;:::;:::;:;:;:;;:::;
Expected 'abc;def', Actual 'abc;def', Matches true
Expected 'ja:3fr', Actual 'ja:3fr', Matches true
Expected ';', Actual ';', Matches true
Expected '', Actual '', Matches true
Expected ':', Actual ':', Matches true
Expected '83;:;:;;;;', Actual '83;:;:;;;;', Matches true
Expected ':;', Actual ':;', Matches true
以下のように、連結演算子(+
)を使用して連結します。
String str1 = "str1";
String str2 = "str2";
int inte = 2;
String result = str1+str2+inte;
ただし、それらを再度分割するには、Stringのsplit関数が区切り文字で機能するため、区切り文字として特殊文字が必要です。