Java 使用正则表达式查找多个匹配项
我正在尝试查找所有出现的(可能是零个或更多)锚(Java 使用正则表达式查找多个匹配项,java,regex,Java,Regex,我正在尝试查找所有出现的(可能是零个或更多)锚()HTML标记,这些标记具有特定属性/文本(作为组捕获) Regex:(.+) 输入字符串: First <a attr1="myattr" attr2="value12" attr3="value13">text1</a> Second <a attr1="myattr" attr2="value12" attr3="value13">text1</ a> Third <a attr1="my
)HTML标记,这些标记具有特定属性/文本(作为组捕获)
Regex:(.+)
输入字符串:
First <a attr1="myattr" attr2="value12" attr3="value13">text1</a> Second <a attr1="myattr" attr2="value12" attr3="value13">text1</
a> Third <a attr1="myattr" attr2="value12" attr3="value13">text1</a>
First text1 Second text1 Third text1
结果:只发现一例。它返回的是第一次出现的默认情况下,
正则表达式是贪婪的,因此*
将匹配尽可能多的字符。您应该改为使用*?
进行非贪婪模式。Regex默认为贪婪模式,因此*
将匹配尽可能多的字符。您应该使用*?
作为非贪婪模式。如用户4098326所述,问题在于贪婪。由于您使用了大量的+
组,因此在字符串结束之前,它们将消耗尽可能多的字符
如用户4098326所述,问题在于贪婪。由于您使用了大量的+
组,因此在字符串结束之前,它们将消耗尽可能多的字符
。像容易犯错误这样的事情(比如使用贪婪的*
而不是勉强的*?
)只是我们应该避免将正则表达式与XML/HTML混合的一小部分原因
- 如果属性被
“
包围,而不是”
- 如果您的HTML包含JavaScript代码,而JavaScript代码具有
document.write(“)
这样,您的代码选择所有具有属性的attr1
attr2
attr3
的a
标记时
Elements elements = doc.select("a[attr1][attr2][attr3]");
演示:
String html=“第一个文本1”
+“第二个文本1”
+“第三文本1”;
Document doc=Jsoup.parse(html);
Elements=doc.select(“a[attr1][attr2][attr3]”;
用于(元素el:元素){
系统输出打印项次(el);
系统输出打印项(el.attr(“attr 1”);
系统输出打印LN(el.attr(“attr2”));
系统输出打印项次(el.attr(“attr3”);
System.out.println(el.text());
System.out.println(“--------------”;
}
输出:
<a attr1="myattr" attr2="value12" attr3="value13">text1</a>
myattr
value12
value13
text1
--------------
<a attr1="myattr" attr2="value12" attr3="value13">text1</a>
myattr
value12
value13
text1
--------------
<a attr1="myattr" attr2="value12" attr3="value13">text1</a>
myattr
value12
value13
text1
--------------
text1
迈特
价值12
价值13
文本1
--------------
文本1
迈特
价值12
价值13
文本1
--------------
文本1
迈特
价值12
价值13
文本1
--------------
。我们应该避免将正则表达式与XML/HTML混用的原因只有一小部分,比如容易出错(比如使用贪婪的*
而不是勉强的*?
)
- 如果属性被
“
包围,而不是”
- 如果您的HTML包含JavaScript代码,而JavaScript代码具有
document.write(“)
这样,您的代码选择所有具有属性的attr1
attr2
attr3
的a
标记时
Elements elements = doc.select("a[attr1][attr2][attr3]");
演示:
String html=“第一个文本1”
+“第二个文本1”
+“第三文本1”;
Document doc=Jsoup.parse(html);
Elements=doc.select(“a[attr1][attr2][attr3]”;
用于(元素el:元素){
系统输出打印项次(el);
系统输出打印项(el.attr(“attr 1”);
系统输出打印LN(el.attr(“attr2”));
系统输出打印项次(el.attr(“attr3”);
System.out.println(el.text());
System.out.println(“--------------”;
}
输出:
<a attr1="myattr" attr2="value12" attr3="value13">text1</a>
myattr
value12
value13
text1
--------------
<a attr1="myattr" attr2="value12" attr3="value13">text1</a>
myattr
value12
value13
text1
--------------
<a attr1="myattr" attr2="value12" attr3="value13">text1</a>
myattr
value12
value13
text1
--------------
text1
迈特
价值12
价值13
文本1
--------------
文本1
迈特
价值12
价值13
文本1
--------------
文本1
迈特
价值12
价值13
文本1
--------------
您想使用正则表达式而不是像jsoup这样的HTML解析器有什么特殊原因吗?您想使用正则表达式而不是像jsoup这样的HTML解析器有什么特殊原因吗?谢谢您的帮助。非贪婪模式帮助解决了这个问题。谢谢您的帮助。非贪婪模式帮助解决了这个问题。