0

トリプル文字を使用して入力文字列に対して正規表現を実行する必要があるという独自の問題ステートメントがあります。たとえば、入力が の場合、入力を として扱い、正規表現パターンをこれらの 3 文字と比較する必要がある ABCDEFGHIため、 のパターン検索はBCDfalse を返す必要があります。ABC+DEF+GHI

同様に、トリプレットの 1 つに一致する正規表現パターンDEFが返されます。trueこの問題ステートメントを使用して、入力が でQWEABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZFGHあり、トリプレットで始まり でABC終わるすべての出力文字列を取得しようとしていると仮定しXYZます。ABCPOIUYTREWXYZしたがって、上記の入力では、出力は と の 2 つの文字列になるはずABCMNBVCXZASXYZです。

また、これらの文字列を ArrayList に格納する必要があります。以下は私の機能です:

public static void newFindMatches (String text, String startRegex, String endRegex, List<String> output) {
    int startPos = 0;
    int endPos = 0;
    int i = 0;
    // Making sure that substrings are always valid
    while ( i < text.length()-2) {
        // Substring for comparing triplets
        String subText = text.substring(i, i+3);
        Pattern startP = Pattern.compile(startRegex);
        Pattern endP = Pattern.compile(endRegex);
        Matcher startM = startP.matcher(subText);
        if (startM.find()) {
            // If a match is found, set the start position
            startPos = i;
            for (int j = i; j < text.length()-2; j+=3) {
                String subText2 = text.substring(j, j+3);
                Matcher endM = endP.matcher(subText2);
                if (endM.find()) {
                    // If match for end pattern is found, set the end position
                    endPos = j+3;
                    // Add the string between start and end positions to ArrayList
                    output.add(text.substring(startPos, endPos));
                    i = j;
                }
            }               
        }
        i = i+3;

    }


}

この関数を main で実行すると、次のようになります。

String input = "QWEABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZFGH";
    String start = "ABC";
    String end = "XYZ";
    List<String> results = new ArrayList<String> ();
    newFindMatches(input, start, end, results);

    for (int x = 0; x < results.size(); x++) {
        System.out.println("Output String number "+(x+1)+" is: "+results.get(x));
    }

次の出力が得られます。

Output String number 1 is: ABCPOIUYTREWXYZ
Output String number 2 is: ABCPOIUYTREWXYZASDFGHJKLABCMNBVCXZASXYZ

最初の文字列が正しいことに注意してください。ただし、2 番目の文字列については、プログラムは再び入力文字列の先頭から読み取ります。代わりに、プログラムが最後の終了パターンの後に読み取るようにします (つまり、最初の検索と ASDFGHJKL などの不要な文字をスキップし、次のように 2 番目の文字列のみを出力する必要があります: ABCMNBVCXZASXYZ

ご回答ありがとうございます

4

1 に答える 1

2

ここでの問題は、最後の一致 (for ループ内の if ステートメント) を見つけたときに、for ループを停止しないことです。そのため、for ループの終了条件 j < text.length()-2 に達するまで、終了一致を探し続けます。一致を見つけて処理したら、「break;」を使用してループを終了する必要があります。「break;」を配置します。i=j 行の後。

技術的には、現在のプログラムで得られた 2 番目の答えが正しいことに注意してください。これも、ABC で始まり XYZ で終わる部分文字列です。プログラムの正しい出力を再考する必要があるかもしれません。一致が見つかったときに i=j を設定しないことで、その状況に対応できます。これにより、i のインクリメントは i=i+3 行だけになり、トリプレットを反復します (ブレークを追加しません)。

于 2013-10-17T02:55:58.087 に答える