1

どの正規表現を使用する必要があるか知りたいです。メソッド内のコードは次のとおりです。

while( (line = bReader.readLine()) != null){
    line2 = line.replaceAll("[\\)][\\|]","R");
    numbers = line2.split("[\\|]");
}
int num = numbers.length;

私が欲しいのは、line等しいとき

(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|

num = を返す必要があります。これは0、 のすべてのインスタンス)|が に置き換えられR、残っていない|ためです。私が得るのは num =1です。

line等しいとき

(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|A#,B#,C#,D#, E#,F#,G#,  |  ,A,  , ,   ,  ,  ,  ,  ,  ,  , ,   ,  ,  ,  |

byを置き換えた後に22 つのインスタンスがあるため、num = を返す必要があります。ここで得られるのは実際には num =です。誰かが私に解決策を教えてくれることを願っています。|)|R2

4

2 に答える 2

1

|によって予測されない文字列に存在するマークの数を調べようとしている場合)は、これらのマークを削除して、文字列の長さがどのように変化したかを確認できます。このようなパイプを検出するには、否定的な後読みを使用できます。

int num = s.length() - s.replaceAll("(?<![)])[|]", "").length();
于 2013-03-25T17:47:41.957 に答える
0

String存在しない区切り文字で aを分割すると、元の が返されStringます。

public static void main(String[] args) throws SQLException {
    System.out.println(Arrays.toString("My string without pipes".split("\\|")));
}

出力:

[My string without pipes]

文字列の末尾にある文字で分割しようとすると、次のように空になりませんStringArray

public static void main(String[] args) throws SQLException {
    System.out.println(Arrays.toString("My string ending in pipe|".split("\\|")));
}

出力:

[My string ending in pipe]

最後の区切り文字が削除されるだけです。

だからあなたの論理は間違っています。2 回目のチェックで正解を得たのは、チェックが正しいからではなく、パイプがたまたま最後にあったからです。

一般に、Stringusingでは区切り文字の数を取得できません。区切り文字で開始または終了しない限りspilt、数を取得します。その場合、単純に削除されます。+1String

あなたがする必要があるのは、正規表現を使用して、閉じ括弧が前にないすべてのパイプを検索することです。これは、否定後読みで行うことができます。

public static void main(String[] args) throws SQLException {
    final String s1 = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|";
    final String s2 = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|A#,B#,C#,D#, E#,F#,G#,  |  ,A,  , ,   ,  ,  ,  ,  ,  ,  , ,   ,  ,  ,  |";
    final Pattern pattern = Pattern.compile("(?<!\\))\\|");
    int count = 0;
    final Matcher matcher = pattern.matcher(s1);
    while (matcher.find()) {
        ++count;
    }
    System.out.println(count);
    count = 0;
    matcher.reset(s2);
    while (matcher.find()) {
        ++count;
    }
    System.out.println(count);
}

出力:

0
2
于 2013-03-25T17:51:44.190 に答える