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*("one or more space") 后跟\\S&&[^>]("one non-space which is not >)。这意味着在你的组中,你要么有零到一些空格,后跟一个非-空格字符。

所以这将匹配 "us-patent-grant" 和>. 并且每次正则表达式引擎匹配它时,它都会值分配给组3。这意味着之前匹配的组丢失了。这就是为什么你有标签的最后一个字符,即".

您可以通过添加+after对其进行一些改进[\\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

于 2013-03-11T04:33:21.087 回答