对于抓取HTML标签正则表达式模式感到困惑

时间:2014-07-12 02:28:30

标签: java regex

我正在阅读regular-expressions.info示例,以尝试了解更多正则表达式模式。

第一个示例Grabbing HTML Tags讨论了特定HTML标记的开始和结束对的正则表达式。

<TAG\b[^>]*>(.*?)</TAG>
我在这里有点困惑。为什么\b[^>]*添加到上面的正则表达式模式中,使用下面的正则表达式模式可以实现相同的目的:

<TAG>(.*?)</TAG>

为什么使用这个额外的正则表达式模式?它会对任何表演有帮助吗?

4 个答案:

答案 0 :(得分:1)

  • 这是为了匹配<a href=...> stuff </a>之类的内容,而不是简单的<b> stuff </b>,您的选项可以使用。
  • 需要\b边界以避免匹配<attribute ...> stuff </a>
  • 等内容
  • 需要使用开始和结束标记之间的延迟量词.*?,而不是[^<]*,因为在开始和结束标记之间您可能有另一个标记(例如<b>

答案 1 :(得分:0)

因为没有单词边界,它不仅匹配任何标签。

DEMO

您可以尝试演示。只需在模式中使用\b进行游戏。

<TAG\b[^>]*>(.*?)</TAG>

<强>解释

  • <匹配<符号。
  • TAG标记名称
  • \b单词字符与非单词字符匹配。
  • [^>]*匹配任何不是>零次或多次的字符。
  • (.*?)?执行不情愿的匹配后,在开始和结束标记中捕获该部分。*
  • </TAG>匹配结束标记。

例如:

输入:

<a href="www.foo.com">link</a>
<ahref="www.foo.com">link</a>

正则表达式:

<a[^>]*>(.*?)<\/a>

上述正则表达式将匹配两个链接。

正则表达式:

<a\b[^>]*>(.*?)<\/a>

但这与第一个匹配,因为a和第一个space字符之间存在单词边界。

答案 2 :(得分:0)

某些开场代码具有<img src="asdf.png">等属性。标记在到达>之前不会结束,因此字边界和非>字符与src="asdf.png"匹配。

答案 3 :(得分:0)

中的\b[^>]*
<TAG\b[^>]*>(.*?)</TAG>

Regular expression visualization

Debuggex Demo

允许在open-tag中有文本(例如参数:width="30")和空格(只要它只有TAG而不是TAGX或其他类型 - - 这是\b word boundary的用途。 html中的语法和间距是非常松散的goosey。允许额外的参数和空格总是安全的,因为单个html标记可以跨越多行。

后者正则表达式

<TAG>(.*?)</TAG>

Regular expression visualization

Debuggex Demo

仅允许开始标记完全 <TAG>然后“可能跨越多行的某些文字”,然后</TAG>

?中的.*?reluctance,这意味着 next close </TAG>是唯一可以匹配的?。取消</TAG>会将其更改为greedy,这意味着匹配搜索字符串中的最后关闭{{1}}。


请务必查看Stack Overflow Regular Expressions FAQ:)