Q:將下面HTML片斷中正確的標題標籤(<h1>
到<h6>
)及其包含的內容匹配出來html
<h1>我是H1</h1>
<div>我是div</div>
<h2>我是H2</h2>
<span>我是span</span>
<h3>我是H3</h3>
<h3>我是錯誤的H3</h4>
<h4>我是H4</h4>
複製代碼
上述這個問題的難點包括:bash
<h1>
到<h6>
<span>我是span</span>
<h3>我是錯誤的H3</h4>
對於第二點,比較好解決,只要在一對標籤內採用懶惰性的匹配就可以避免。可是對於第一和第三點,就須要借用正則的回溯引用了spa
回溯引用指的是模式的後半部分引用在前半部分中定義的子表達式,且只能用來引用模式裏的子表達式(子表達式即用元字符(
和)
括起來的部分)。簡單理解,能夠將回溯引用想象成對變量的引用。code
\1
表示引用第1個子表達式,\2
表示引用第2個子表達式,以此類推(一般,回溯引用從1開始匹配)。cdn
因爲子表達式是按照其在表達式中的相對位置來引用的,所以有個很差之處在於,一旦改變了子表達式的相對位置,很容易引發正則的回溯引用失效。htm
OK,如今就能夠給出文章開頭問題的答案了:blog
<[hH]([1-6])>.*?</[hH]\1>
複製代碼
其中\1
指回溯引用第一個子表達式,即引用([1-6])
。且開閉標籤內採用懶惰性的匹配.*?
,而不是貪婪式的.*
。 it