我正在阅读regular-expressions.info示例,以尝试了解更多正则表达式模式。
第一个示例Grabbing HTML Tags讨论了特定HTML标记的开始和结束对的正则表达式。
<TAG\b[^>]*>(.*?)</TAG>
我在这里有点困惑。为什么\b[^>]*
添加到上面的正则表达式模式中,使用下面的正则表达式模式可以实现相同的目的:
<TAG>(.*?)</TAG>
为什么使用这个额外的正则表达式模式?它会对任何表演有帮助吗?
答案 0 :(得分:1)
<a href=...> stuff </a>
之类的内容,而不是简单的<b> stuff </b>
,您的选项可以使用。\b
边界以避免匹配<attribute ...> stuff </a>
.*?
,而不是[^<]*
,因为在开始和结束标记之间您可能有另一个标记(例如<b>
) 答案 1 :(得分:0)
因为没有单词边界,它不仅匹配任何标签。
您可以尝试演示。只需在模式中使用\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>
允许在open-tag中有文本(例如参数:width="30"
)和空格(只要它只有TAG
而不是TAGX
或其他类型 - - 这是\b
word boundary的用途。 html中的语法和间距是非常松散的goosey。允许额外的参数和空格总是安全的,因为单个html标记可以跨越多行。
后者正则表达式
<TAG>(.*?)</TAG>
仅允许开始标记完全 <TAG>
然后“可能跨越多行的某些文字”,然后</TAG>
。
?
中的.*?
为reluctance,这意味着 next close </TAG>
是唯一可以匹配的?
。取消</TAG>
会将其更改为greedy,这意味着匹配搜索字符串中的最后关闭{{1}}。