2

特定の質問がありますが、オンラインで答えを見つけることができませんでした。基本的には、複数のパターンを持つテキストに対してパターンマッチング操作を実行したいと思います。ただし、マッチャーが一度に結果を取得するのではなく、ループのさまざまなステージで各パターンが呼び出されると同時に、これらの各ステージで特定の操作が実行されることを望んでいます。たとえば、私が、、、を持っていると想像するPattern1Pattern2Pattern3次のようになります。

 if (Pattern 1 = true) {
        delete Pattern1;
    } else if (Pattern 2 = true) {
        delete Pattern2;
    } else if (Pattern 3 = true) {
        replace with 'something;
    } .....and so on

(これはループの単なる説明であるため、構文が正しくない可能性があります)。

私の質問は、異なるパターンを別々に呼び出しながら、どのようにコンパイルできるかということです。(AND / ORなどの助けを借りて一緒にコンパイルおよび検索された複数のパターンを見ただけです。残念ながらそれは私が探しているものではありません)パターンを配列に保存して、それぞれを自分のループ?

4

2 に答える 2

2

Patternオブジェクトを準備pattern1, pattern2, pattern3し、任意のコンテナー (配列またはリスト) に格納します。次に、反復ごとにオブジェクトusePattern(Pattern newPattern)のメソッドを使用して、このコンテナをループします。Matcher

于 2012-08-29T16:23:43.880 に答える
1

共通のインターフェイスを作成し、パターンを使用する匿名の実装を作成するか、文字列を変換したいものを作成できます。

interface StringProcessor {
    String process(String source);
}

StringProcessor[] processors = new StringProcessor[] {
    new StringProcessor() {
        private final Pattern p = Pattern.compile("[0-9]+");
        public String process(String source) {
            String res = source;
            if (p.matcher(source).find()) {
                res = ... // delete
            }
            return res;
        }
    }
,   new StringProcessor() {
        private final Pattern p = Pattern.compile("[a-z]+");
        public String process(String source) {
            String res = source;
            if (p.matcher(source).find()) {
                res = ... // replace
            }
            return res;
        }
    }
,   new StringProcessor() {
        private final Pattern p = Pattern.compile("[%^#@]{2,5}");
        public String process(String source) {
            String res = source;
            if (p.matcher(source).find()) {
                res = ... // do whatever else
            }
            return res;
        }
    }
};

String res = "My starting string 123 and more 456";
for (StringProcessor p : processors) {
    res = p.process(res);
}

StringProcessor.processの実装では、正規表現をまったく使用する必要がないことに注意してください。下部のループは、正規表現が結果の取得に関与していることを認識していません。

于 2012-08-29T16:26:17.647 に答える