无法从Java中的匹配*组中检索数据

时间:2013-03-11 02:25:36

标签: java regex

我无法弄清楚正确的正则表达式。

以下是一些示例代码:

@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中有双引号?

由于 专利

1 个答案:

答案 0 :(得分:1)

即使使用XML解析器也是合理的,我想我可以解释正则表达式中的错误:

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

您尝试匹配((\\s*[\\S&&[^>]])*)*部分中的参数。看看你最里面的小组:你有\s*(“一个或多个空格”),然后是\\S&&[^>](“一个非空格,不是>)。这意味着你的小组,您将从零到一些空格,后跟一个非空格字符。

因此,这将匹配“us-patent-grant”和>之间的任何非空格字符。每当正则表达式引擎匹配它时,它将值分配给组3.这意味着先前匹配的组将丢失。这就是为什么你有标签的最后一个字符,即"

您可以在+之后添加[\\S&&[^>]]来改善它,因此它至少会匹配一个完整的非空格序列,但您只能获得组中的最后一个标记属性。您应该使用更好更简单的方法:

您的目标是在群组中提取seq="002" image="D000001",您应该做的只是匹配“us-patent-grant”之后不是>的每个字符的顺序:

"<(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