1

適切な正規表現を理解するのに苦労しています。

サンプルコードは次のとおりです。

@Test
public void testFindEasyNaked() {
    System.out.println("Naked_find");
    String arg = "hi mom <us-patent-grant seq=\"002\" image=\"D000001\" >foo<name>Fred</name></us-patent-grant> extra stuff";
    String nakedPat = "<(us-patent-grant)((\\s*[\\S&&[^>]])*)*\\s*>(.+?)</\\1>";
    System.out.println(nakedPat);

    Pattern naked = Pattern.compile(nakedPat, Pattern.MULTILINE + Pattern.DOTALL );
    Matcher m = naked.matcher(arg);
    if (m.find()) {
        System.out.println("found naked");
        for (int i = 0; i <= m.groupCount(); i++) {
            System.out.printf("%d: %s\n", i, m.group(i));
        }
    } else {
        System.out.println("can't find naked either");
    }
    System.out.flush();
}   

私の正規表現は文字列と一致しますが、繰り返されるパターンを引き出すことができません。私が欲しいのは

   seq=\"002\" image=\"D000001\" 

集団で引き抜いた。これは、プログラムを実行したときに表示されるものです。

Naked_find
<(us-patent-grant)((\s*[\S&&[^>]])*)*\s*>(.+?)</\1>
found naked
0: <us-patent-grant seq="002" image="D000001" >foo<name>Fred</name></us-patent-grant>
1: us-patent-grant
2: 
3: "
4: foo<name>Fred</name>

グループ #4 は問題ありませんが、#2 と #3 のデータはどこにあり、#3 に二重引用符があるのはなぜですか?

ありがとうパット

4

1 に答える 1

1

XMLパーサーを使用するのが適切だとしても、正規表現のエラーを説明できると思います:

String nakedPat = "<(us-patent-grant)((\\s*[\\S&&[^>]])*)*\\s*>(.+?)</\\1>";

パーツ内のパラメータを一致させようとしています((\\s*[\\S&&[^>]])*)*。最も内側のグループを見てください: \s*(「1 つ以上のスペース」) の後に\\S&&[^>](「ではない 1 つの非スペース」) があり>ます。これは、グループ内で、ゼロからいくつかのスペースの後に単一の非スペースが続くことを意味します。 -スペース文字。

したがって、これは「us-patent-grant」と>. そして、正規表現エンジンが一致するたびに、値をグループ 3 に割り当てます。これは、以前に一致したグループが失われることを意味します。そのため、タグの最後の文字、つまり".

+afterを追加することで少し改善できるため[\\S&&[^>]]、少なくともスペース以外の完全なシーケンスに一致しますが、グループ内の最後のタグ属性しか取得できません。代わりに、より優れた簡単な方法を使用する必要があります。

あなたの目標は、グループで引き出すことです。あなたがすべきことは、単に「us-patent-grant」の後seq="002" image="D000001"にないすべての文字のシーケンスを一致させることです:>

"<(us-patent-grant)\\s*([^>]*)\\s*>(.+?)</\\1>"

これにより、グループに次の値が含まれます。

Group 1: us-patent-grant
Group 2: seq=\"002\" image=\"D000001\"
Group 3: foo<name>Fred</name>

Regexplanet でのテストは次のとおりです: http://fiddle.re/ezfd6

于 2013-03-11T04:33:21.087 に答える