Java 提取html页面的所有标记
我将尝试获取包含页面字符串内容的所有标记。 到目前为止,我的正则表达式不够精确,如下所示: .+ 这将符合以下条件:Java 提取html页面的所有标记,java,regex,Java,Regex,我将尝试获取包含页面字符串内容的所有标记。 到目前为止,我的正则表达式不够精确,如下所示: .+ 这将符合以下条件: <p>Il <b>1943</b> (wrong) <b>1943</b> (correct) <p>Il <b>1943</b></p> (correct) 如何指定正则表达式以仅匹配标记,哪些开始标记和结束标记是相同的 publ
<p>Il <b>1943</b> (wrong)
<b>1943</b> (correct)
<p>Il <b>1943</b></p> (correct)
如何指定正则表达式以仅匹配标记,哪些开始标记和结束标记是相同的
public static List<String> getAllTags(String html){
List<String> listTags=new ArrayList<String>();
Pattern p = Pattern.compile("<.+>(.+?)</.+>");
Matcher m = p.matcher(html);
while(m.find()) {
String tag = m.group(1);
String teststring = m.group();
listTags.add(teststring );
System.out.println(teststring );
}
return listTags;
}
如果您只想获取内部标记和内容,那么这是可行的。 请注意,如果Java可以执行递归,则可以使用嵌套的匹配标记。 不幸的是,它不做递归 小心使用正则表达式解析html,这很危险 [\\w:][+\\b?:\[\\S\\S]*?\\\\\'[\\S]*?'\\\\\\\\\\\\\\\\\'[\\S]*?'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[\\S\\S]*?\\\\\''[\\S\\S]*?'?:?!/>[^>]?+?\\s*>[\\s\\s]*?:/?[\\w:][+\\s*/?:[\\w:][+\\s+?:\[\\s\\s]*?\*?'[\\s\\s]*?'.[^>]+\\s*/?\?[\\s]*?\?[\\s]*?\?:!?::DOCTYPE[\\S\\S]*?\124;?:\\[CDATA\\[[\\S\\S]*?\\]\\\]\]\124;?:-[\\ S\\S]*?-\124;?:ATTLIST[\\S\\S]*?\124;?:实体[\\S\\S]*?:元素[\\S]*?>[\\S\\S]* 演示: 刮刀系列 没有解释的格式:
<
(?>
( [\w:]+ ) # (1)
\b
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
)
>
(?:
(?!
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (2 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (2 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! /> )
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \2 \s*
(?= > )
)
| (?: /? [\w:]+ \s* /? )
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*? )
| (?: \[CDATA\[ [\S\s]*? \]\] )
| (?: -- [\S\s]*? -- )
| (?: ATTLIST [\S\s]*? )
| (?: ENTITY [\S\s]*? )
| (?: ELEMENT [\S\s]*? )
)
)
)
>
)
[\S\s]
)*?
<
(?: / \1 \b \s* )
>
您可能对此感兴趣:当我们有了正则表达式模式时,没有理由使用正则表达式模式来解析Java中的HTML,这在现实世界的HTML中非常有效