0

正規表現はよくわかりません。数字 2、3、5、または 7 で始まり、途中で 1、3、7、または 9 であり、3 または 7 で終わる文字列を見つけようとしています。

私の試みは [2357][1379]*[37] でした。それは動作しません。訂正いただければ幸いです。これは Java String.matches() 関数を対象としていることを思い出してください。前もって感謝します

   for (int s = 0; s < primes.size(); ++s) {
        String p = primes.get(s);

        if (!p.matches([REGEX GOES HERE])) {
            System.out.println(p);
            primes.remove(s);
        }
    }
4

4 に答える 4

1

ループ内で削除するコレクションを反復する標準的な方法は、削除が後続の要素のインデックスに影響を与えないように下方に反復することです。

for (int s = primes.size() - 1; s >= 0; s--) {
    String p = primes.get(s);
    if (!p.matches("[2357][1379]*[37]")) {
        System.out.println(p);
        primes.remove(s);
    }
}

要素を削除した場合の影響について心配する必要はありません。

于 2013-09-19T04:39:40.380 に答える
0

こんにちは、私が間違っているかどうかはわかりません..しかし、たとえば、最初のパターンに問題はありません

String aa = "[2357][1379]*[37]";
String bb = "2977313";

boolean matches = Pattern.matches(aa, bb); 
System.out.println("1) "+matches);

私は 2 番から始めて 3 番で終わり、その間に 1379 を追加しましたが、期待どおりに動作します。私が間違っている場合は修正してください

于 2013-09-19T03:56:46.857 に答える
0

次のコードは問題なく「動作」します。

    List<String> primes = new ArrayList<String>();
    primes.add("1");
    primes.add("2");
    primes.add("7");
    primes.add("23");
    primes.add("213");
    primes.add("243");
    primes.add("2113");
    primes.add("2193");
    for (int s = 0; s < primes.size(); ++s) {
        String p = primes.get(s);

        if (!p.matches("[2357][1379]*[37]")) {
            System.out.println(p);
            primes.remove(s);
        }
    }

以下を出力します。

1
7
243

あなたはそれが出力することを期待しているかもしれません:

1
2
7
243

ただし、primes.remove(s)ループが台無しになっています。それは本当にあなたのデザインの意図ではありません。(しかし、誰が知っていますか?!) 以下は、ループの混乱を避けるための多くの解決策の 1 つです。

    for (String prime : new ArrayList<String>(primes)) {
        if (!prime.matches("[2357][1379]*[37]")) {
            System.out.println(prime);
            primes.remove(prime);
        }
    }
于 2013-09-19T04:03:53.007 に答える
0

あなたの正規表現はうまく機能します。ただし、removeは後続の要素を左にシフトするため、String通常の at 位置s + 1は に移動しs、次にチェックする要素はsではなくat 位置になりs + 1ます。修理:

for (int s = 0; s < primes.size();) {
    String p = primes.get(s);

    if (!p.matches("[2357][1379]*[37]")) {
        System.out.println(p);
        primes.remove(s);
    } else 
        ++s;
}
于 2013-09-19T04:08:56.573 に答える