正則的回溯引用

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

  1. 必須匹配每一個<h1><h6>
  2. 不能將包含在兩個標題標籤內的標籤匹配到,如<span>我是span</span>
  3. 不能匹配格式不正確的標題標籤,如<h3>我是錯誤的H3</h4>

對於第二點,比較好解決,只要在一對標籤內採用懶惰性的匹配就可以避免。可是對於第一和第三點,就須要借用正則的回溯引用了spa

正則的回溯引用

回溯引用指的是模式的後半部分引用在前半部分中定義的子表達式,且只能用來引用模式裏的子表達式(子表達式即用元字符()括起來的部分)。簡單理解,能夠將回溯引用想象成對變量的引用。code

使用方法

\1表示引用第1個子表達式,\2表示引用第2個子表達式,以此類推(一般,回溯引用從1開始匹配)。cdn

注意事項

因爲子表達式是按照其在表達式中的相對位置來引用的,所以有個很差之處在於,一旦改變了子表達式的相對位置,很容易引發正則的回溯引用失效。htm

答案來了

OK,如今就能夠給出文章開頭問題的答案了:blog

<[hH]([1-6])>.*?</[hH]\1>
複製代碼

其中\1回溯引用第一個子表達式,即引用([1-6])。且開閉標籤內採用懶惰性的匹配.*?,而不是貪婪式的.*it

匹配結果
相關文章
相關標籤/搜索