我试图匹配HTML文档中的多个CSS样式代码块.此代码将匹配第一个但与第二个不匹配.我需要什么代码来匹配第二个.我可以获得一个列在"样式"括号内的组的列表吗?我应该调用'find'方法来获得下一场比赛吗?
这是我的正则表达式模式
^.*(<style type="text/css">)(.*)(</style>).*$
Run Code Online (Sandbox Code Playgroud)
用法:
final Pattern pattern_css = Pattern.compile(css_pattern_buf.toString(),
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
final Matcher match_css = pattern_css.matcher(text);
if (match_css.matches() && (match_css.groupCount() >= 3)) {
System.out.println("Woot ==>" + match_css.groupCount());
System.out.println(match_css.group(2));
} else {
System.out.println("No Match");
}
Run Code Online (Sandbox Code Playgroud)
bob*_*nce 14
我试图匹配HTML文档中的多个CSS样式代码块.
标准答案:不要使用正则表达式来解析HTML.无论你表达多么复杂和聪明,正则表达式都无法可靠地解析HTML.除非您完全确定目标文档的确切格式是完全固定的,否则字符串或正则表达式处理是不够的,您必须使用HTML解析器.
(<style type="text/css">)(.*)(</style>)
Run Code Online (Sandbox Code Playgroud)
那是一种贪婪的表达.中间的(.*)将尽可能多地匹配.如果您有两个样式块:
<style type="text/css">1</style> <style type="text/css">2</style>
Run Code Online (Sandbox Code Playgroud)
然后它会愉快地匹配'1 </ style> <style type ="text/css"> 2'.
使用(.*?)获取非贪婪表达式,这将允许尾随(</ style>)在第一次机会时匹配.
我应该调用'find'方法来获得下一场比赛吗?
是的,你应该用它来获得第一场比赛.通常的习语是:
while (matcher.find()) {
s= matcher.group(n);
}
Run Code Online (Sandbox Code Playgroud)
请注意,标准字符串处理(indexOf等)可能比正则表达式更简单,因为您只使用完全固定的字符串.但是,标准答案仍然适用.
归档时间: |
|
查看次数: |
10787 次 |
最近记录: |