2

パイプ記号 "| を区切り文字として使用した文字列があります。ただし、文字列データにはパイプ記号も​​含まれています。これを無視する方法はありますか?

例:

name|address|age

John|123 Wood Road|Street, London|25

したがって、私がこれを行うとき -

text.split("\\|")

私に与えます:

John

123 Wood Road

Street, London

25

私はこれを期待しています:

John

123 Wood Road|Street, London

25
4

6 に答える 6

6

String.split()同じシンボルの異なる出現を区別することはできません。コードまたは正規表現のいずれかで、いくつかのルールを設定する必要があります。あなたのデータに基づいて、パイプは文字列データ内で発生する可能性があると言っていますが、実際には名前や年齢では発生しないため、次のようなことができると思います。

String[] results = text.split("\\|")

String name = results[0];
String age = results[results.length - 1]

String address = results[1];
for (int i = 2; i < results.length-1; i++) {
    address = address + "|" + results[i];
}
于 2012-06-14T20:26:44.833 に答える
1

ただし、文字列データにはパイプ記号も​​含まれています。これを無視する方法はありますか?

これは間違った解決方法です。

ユーザーが名前、住所、年齢を入力した場合は、保管する前にサニタイズする必要があります

この場合、ユーザー入力をどのようにサニタイズしますか。通常、ユーザーが入力したパイプ文字はバックスラッシュでエスケープします (最終的な文字列を連結する前に)。

John|123 Wood Road|Street, London|25

あなたは保存します

John|123 Wood Road\|Street, London|25

このようにして、ユーザーが入力したものをいつでも取り戻すことができます。

  1. エスケープされていないパイプ文字での分割
  2. 各パーツのアンエスケープ。

ただし、これには OpenCSV などのライブラリを使用することをお勧めします。

于 2012-06-14T20:25:32.873 に答える
1

簡単な答えは、別の区切り文字を使用することです。

これは確実ではありませんが、新しい区切り文字が自分の一部 (名前、住所、または年齢) の有効な文字として検出される可能性があるためです。

私のより良い提案は、パイプに遭遇したときにパイプを区切りパイプとして扱わないように、ある種のエスケープ文字を組み込むことです。(おそらく\???)

に提供する正規表現でエスケープ文字を使用しているため、エスケープ文字の概念に精通していると思いますString.split()

"John|123 Wood Road\|Street, London|25"

于 2012-06-14T20:28:03.140 に答える
1

これはあなたが探しているものですか?

String text = "John|123 Wood Road|Street, London|25";

int first = text.indexOf("|");
int last = text.lastIndexOf("|");

String name = text.substring(0, first);
String age = text.substring(last + 1);
String address = text.substring(first + 1, last);

System.out.println(name);
System.out.println(address);
System.out.println(age);

出力:

John
123 Wood Road|Street, London
25

より一般的な解決策:

public static void main(String[] args)
{
    String text = "John|123 Wood Road|Street, London|25";
    for(String s : getArray(text, 0, 1, 0)) System.out.println(s);
}

public static String[] getArray(String text, int... pipeCount)
{
    String[] arr = text.split("\\|");
    String[] result = new String[3];

    int counter = 0;
    for(int i = 0; i < result.length; i++)
    {
        result[i] = "";
        for(int j = 0; j <= pipeCount[i]; j++) result[i] += arr[counter++];
    }
    return result;
}

出力:

John
123 Wood Road|Street, London
25
于 2012-06-14T20:28:05.387 に答える
1
  • 一般に、データの一部を区切り文字として使用することはできません。区切り文字とデータが同じ文字の場合、どのように区別できますか? ||これを回避する方法は、データに存在する可能性が低い二重パイプやその他のパタ​​ーンのような珍しいものを区切り文字として使用することです。
  • 可能であれば、XML、JSON、CSV などの他のデータ形式を使用できます。これは常に機能するため、以前のものよりもはるかに優れたソリューションです。
  • この特定のケースでは、住所のみを含めることができ|、名前と年齢を含めることはできないと確信している場合は、最初のものを名前として、最後のものを年齢として、それらの間のすべての部分を住所として取る|ことができます。|それらの間に複数の部分がある場合、アドレスには が含まれます||その後、それらがアドレスの一部であることを知って、中間部分を結合できます。|ただし、最初と最後のフィールドで が許可されている場合、これは機能しないため、これは良い解決策ではありません。
于 2012-06-14T20:28:07.133 に答える
1

何らかの方法でユーザー入力をエスケープできます。たとえば、|が区切り文字で、データに区切り文字が含まれている場合は、次のように変更します%p(p for pipe!)。ただし、 all もエスケープする必要があります%。データをシリアル化するときにこれを行い、逆シリアル化するときに元に戻します。

于 2012-06-14T20:42:19.263 に答える