我会尝试获取包含页面内容(String)的所有标签。 到目前为止我的正则表达式不够精确如下: "< + GT;&#34(。+?);
这将匹配以下内容:
<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;
}
答案 0 :(得分:0)
如果你只想获得内部标签和内容,这是有效的 (请注意,如果Java可以进行递归,则可以使用嵌套匹配标记 不幸的是,它没有进行递归)
谨防使用正则表达式解析html,这是危险的。
"<(?>([\\w:]+)\\b(?:\"[\\S\\s]*?\"|'[\\S\\s]*?'|[^>]?)+)>(?:(?!<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\\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*)>"
演示:https://regex101.com/r/I0NgZZ/1
刮刀系列
格式化(没有解释):
<
(?>
( [\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* )
>