正則表達式學習-回溯引用backreference – JAVA編程語言程序開發技術文章

PS:在所有例子中正則表達式匹配結果包含在源文本中的【和】之間,有的例子會使用java來實現,如果是java本身正則表達式的用法,會在相應的地方說明。所有java例子都在JDK1.6.0_13下測試通過。

 

一、問題引入

         一個在HTML頁面中匹配標題標簽(H1—H6)的問題:

文本:

<body>

<h1>Welcome to my page</H1>

Content is pided into twosections:<br>

<h2>Introduction</h2>

Information about me.

<H2>Hobby</H2>

Information about my hobby.

<h2>This is invalid HTML</h3>

</body>

正則表達式:<[hH][1-6]>.*?</[hH][1-6]>

結果:

<body>

【<h1>Welcome to my page</H1>】

Content is pided into twosections:<br>

【<h2>Introduction</h2>】

Information about me.

【<H2>Hobby</H2>】

Information about my hobby.

【<h2>This is invalid HTML</h3>】

</body>

分析:模式<[hH][1-6]>匹配任何一級標題的開始標簽,而且不區分大小寫,在這個例子中它匹配到瞭<h1>、<h2>,</[hH][1-6]>匹配到瞭</h1>、</h2>、</h3>;這裡使用瞭懶惰型元字符來匹配標簽中的文本,否則會匹配到從第一個開始標簽到最後一下結束標簽之間的內容。但是從結果可以看出,有一個無效的標簽也匹配上瞭,即<h2></h3>,它們根本不能配對。要解決這個問題,就需要使用到回溯引用(backreference)。

 

二、回溯引用匹配

         回溯引用是指模式的後半部分引用在前半部分中定義的子表達式。至於子表達式的使用、劃分和引用,在前面一篇已經介紹過瞭。現在來解決前面的例子:

文本:  www.aiwalls.com

<body>

<h1>Welcome to my page</H1>

Content is pided into twosections:<br>

<h2>Introduction</h2>

Information about me.

<H2>Hobby</H2>

Information about my hobby.

<h2>This is invalid HTML</h3>

</body>

正則表達式:<[hH]([1-6])>.*?</[hH]\1>

結果:

<body>

【<h1>Welcome to my page</H1>】

Content is pided into twosections:<br>

【<h2>Introduction</h2>】

Information about me.

【<H2>Hobby</H2>】

Information about my hobby.

<h2>This is invalid HTML</h3>

分析:首先匹配開始標題標簽的模式<[hH]([1-6])>,使用括號把[1-6]做為子表達式,而匹配結束標題標簽模式為</[hH]\1>,其中\1表示引用第一個子表達式,即([1-6]),如果([1-6])匹配到的是1,那\1也匹配到1,如果匹配到2,那\1也匹配到2,所以最後一個無效的標題標簽就不會被匹配到瞭。

發佈留言