gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:45:36 24 4
gpt4 key购买 nike

我无法找出正确的正则表达式。

这里是一些示例代码:

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

谢谢帕特

最佳答案

即使使用 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

关于java - 无法从 Java 中匹配的 * 组中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15330269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com