1

私は次のパターンを持っています:

Pattern TAG = Pattern.compile("(<[\\w]+]>)|(</[\\w]+]>)");

| 注意してください。パターンで。

そして、このパターンで何らかの処理を行うメソッドがあります

private String format(String s){
    Matcher m = TAG.matcher(s);
    StringBuffer sb = new StringBuffer();

    while(m.find()){
        //This is where I need to find out what part
        //of | (or) matched in the pattern
        // to perform additional processing


    }
    return sb.toString();
}

正規表現で一致した OR の部分に応じて、さまざまな機能を実行したいと思います。パターンを 2 つの異なるパターンに分割し、それぞれに一致させることができることはわかっていますが、実際の正規表現ははるかに複雑であり、達成しようとしている機能がうまく機能するため、それは私が探している解決策ではありません。それを単一のループと正規表現で。だから私の質問はそれです:

ORのどの部分が正規表現に一致したかをJavaで見つける方法はありますか?

編集 m.group() 機能も認識しています。私の場合はうまくいきません。以下の例 では、ループの最初の反復で it が一致し 、2 番目の反復で on が出力さ<TAG>れます。ただし、各反復でどの部分が一致したかを知る必要があります。</TAG><[\\w]+></[\\w]+>

static Pattern u = Pattern.compile("<[\\w]+>|</[\\w]+>");

public static void main(String[] args) {
String xml = "<TAG>044453</TAG>";

Matcher m = u.matcher(xml);

while (m.find()) {
    System.out.println(m.group(0));
}
}
4

3 に答える 3

1

group()のメソッドを見てください。次のMatcherようなことができます。

if (m.group(1) != null) {
    // The first grouped parenthesized section matched
}
else if (m.group(2) != null) {
    // The second grouped parenthesized section matched
}

編集: 元のグループ番号に戻しました - 余分な括弧は必要ありませんでした。これは、次のようなパターンで機能するはずです。

static Pattern TAG = Pattern.compile("(<[\\w]+>)|(</[\\w]+>)");
于 2013-06-26T19:48:00.827 に答える
0

すでにクラスであるため、[]withを使用する必要はありません。\\wまた、OR 部分のすべてのオプションを括弧で囲むと、それらをグループとして使用できるようになります (グループの 1 つが見つからない場合は、null 参照になります)。したがって、コードは次のようになります。

static Pattern u = Pattern.compile("(<\\w+>)|(</\\w+>)");

public static void main(String[] args) {
    String xml = "<TAG>044453</TAG>";

    Matcher m = u.matcher(xml);

    while (m.find()) {
        if (m.group(1)!=null){// <- group 1 (<\\w+>)
            System.out.println("I found <...> tag: "+m.group(0));
        }else{ // if it wasn't (<\\w+>) then it means it had to be (</\\w+>) that was mathced 
            System.out.println("I found </...> tag: "+m.group(0));
        }
    }
}

パターンを少し変更し<(/?)\\w+>て、/一部をオプションにして括弧内に配置することもできます (この場合はグループ 1 になります)。このように、タグがない場合/、グループ1には空の文字列のみが含まれる""ため、ロジックを次のように変更できます

        if ("".equals(m.group(1))) {// 
            System.out.println("I found <...> tag: " + m.group(0));
        } else { 
            System.out.println("I found </...> tag: " + m.group(0));
        }
于 2013-06-26T20:45:10.207 に答える
0

共通部分を除外して、パターンを書き直す必要があります。

xy|xz  => x(y|z)
xy|x   => xy?
yx|x   => y?x

あとは、括弧のように気になる部分を入れることy?で、 group() で設定されているかどうかを確認できます。

于 2013-06-26T20:41:18.647 に答える