我无法弄清楚正确的正则表达式。
以下是一些示例代码:
@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中有双引号?
由于 专利
答案 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