0

正規表現を実行する方法がわからないため、これについてもう一度助けが必要です。

分割したい文字列は次のとおりです。

String str = "ERR||||TEST|GET|POST|UPDATE|"

1 で始まるフィールド インデックスを指定すると、文字列を分割した後、その位置の文字列を返す関数があります。ただし、問題は、これがフィールド インデックスにカウントされるため、正規表現が区切り文字間の空の文字列を返さないことです。この正規表現を変更して、これらの空のフィールドを含めるにはどうすればよいですか?

private static String extractField(String strt, int fieldNo)
{
    Pattern pattern = Pattern.compile("[^|]+");
    String str = strt.replaceAll("\\r", "");
    Matcher matcher = pattern.matcher(str);
    int i = 1;
    while (matcher.find()) {
        String fS = matcher.group().trim();
        System.out.println("Result: \"" + fS + "\"");
        if (i++==fieldNo) {
            return fS;
        }
    }
    return "";
}
4

4 に答える 4

3

なぜ使用しないのsplitですか?...

String[] x = str.split("\\|");
System.out.println(Arrays.toString(x));
于 2013-05-20T02:17:12.010 に答える
1

| で分割を行う あなたが望むものをもたらすでしょう。

このようなもの:

    String s = "ERR||||TEST|GET|POST|UPDATE|";
    String [] a = s.split("\\|");
    for (int i=0; i<a.length; i++) {
      System.out.println(a[i]);
    }
于 2013-05-20T02:17:20.980 に答える
1

ルックアラウンドメカニズムを使用して、正規表現を簡単にアップグレードできます。多分この方法を試してください[^|]+|(?<=[|])。追加部分は、「それより前にある空の文字列のOR」|(?<=[|])を意味します。 |

この正規表現のおかげでERR||||TEST|GET|POST|UPDATE|

"ERR", "", "", "", "TEST", "GET", "POST", "UPDATE", ""

最後にしたくない場合""は、 を使用できます[^|]+|(?<=[|])(?=[|])「2つの間に存在する空の文字列」(?<=[|])(?=[|])意味するため、このパターンの結果は |

"ERR", "", "", "", "TEST", "GET", "POST", "UPDATE"
于 2013-05-20T03:52:45.280 に答える
1

ベースのソリューションを探しているのでPattern、次の正規表現を使用できます。

(?<=(^|\|))(.*?)(?=(\||$))

それらは、肯定的な先読み ( (?=X)) と肯定的な後読み ( (?<=X)) です。|このミルは、2 つの の間、文字列の先頭 ( ^) と a の|間、または文字列の a|と末尾( ) の間のすべてに一致します$。先読みと後読みはゼロ幅のアサーションであるため|、グループに含まれません。また、?in.*?は非貪欲になります。

コード:

private static String extractField(String strt, int fieldNo)
{
    Pattern pattern = Pattern.compile("(?<=(^|\\|))(.*?)(?=(\\||$))");
    String str = strt.replaceAll("\\r", "");
    Matcher matcher = pattern.matcher(str);
    int i = 1;
    while (matcher.find()) {
        String fS = matcher.group().trim();
        System.out.println("Result: \"" + fS + "\"");
        if (i++==fieldNo) {
            return fS;
        }
    }
    return "";
}

の結果"ERR||||TEST|GET|POST|UPDATE|":

Result: "ERR"
Result: ""
Result: ""
Result: ""
Result: "TEST"
Result: "GET"
Result: "POST"
Result: "UPDATE"
Result: ""
于 2013-05-20T02:29:24.507 に答える