正則表達式自我複習

一、開始結束
^word:匹配以word打頭的字符串;
word$:匹配以word結尾的字符串;
^word$:匹配word本身;


二、重複次數
ab*:匹配串中,ab(其中b可以爲0-n個)
ab+:匹配串中,ab(其中b可以爲1-n個)
ab?:匹配串中,ab(其中b可以爲0-1個)
{n,m},對上面3種重複的通用模式,其中逗號和m可爲空,如{n}、{n,}


三、或、[]、()
¦:代表或者,比如:"(b¦cd)ef":表示"bef"或"cdef";"(a¦b)*c":表示一串"a""b"混合的字符串後面跟一個"c";
():一般給或配合使用
[]:[ab]===(a|b),中括號代表的是一個字符。[a-d]===(a¦b¦c¦d)===[abcd]
  中括號中還有一種特殊用法,可以用^代表非
四、特殊字符
.  代表除換行符以外任何一個字符,比如"^.{3}$":表示有任意三個字符的字符串(長度爲3個字符)
\w 匹配字母或數字或下劃線或漢字 等價於 '[^A-Za-z0-9_]'。
\s 匹配任意的空白符(大寫代表相反)
\d 匹配數字(大寫代表相反)

\b 匹配單詞的開始或結束(大寫代表相反)

五、匹配模式:

1、貪婪模式:(默認),最大範圍的匹配

2、勉強模式:最小範圍的匹配,?號

3、佔用模式:也是最大範圍的匹配,但是匹配到後,不讓出來了,會導致後續的匹配字符也匹配不到 。 + 號


再看下面一個例子:貪婪模式與侵佔模式的比較
正則:\w+[a-z]與\w++[a-z]
目標串:232hjdhfd7474$
分析:①\w+[a-z]:\w+屬於貪婪模式,會一次性吃掉它所能吃掉的所有的字符,也就是子串232hjdhfd7474,此時[a-z]不能夠找到匹配了,故\w+匹配的串會吐出一個字符4,但此時還是得不到匹配。反覆的這樣吐出回退,直到吐出字符d時,此時[a-z]能夠匹配h,所以這時正則表達式會返回一次成功的匹配結果,爲232hjdhfd
②\w++[a-z]:\w++屬於侵佔模式,它會一次性吃掉它所能夠吃掉的所有字符,即子串232hjdhfd7474,而且不留給其他部分使用,故不會回退。此時[a-z]不能夠找到匹配,所以此次匹配失敗。在餘下的子串中也找不到能匹配成功的子串。所以整個正則表達式是找不到匹配結果的!


實戰(查找程序代碼):

正則:

<div data-options="region:'north',border:false,collapsed:false" class="page-title" style="overflow:hidden">[\s\S]*導出Word"></span>([\s\S]*?</div>){2}


被查找對象:

<div data-options="region:'north',border:false,collapsed:false" class="page-title" style="overflow:hidden">
			<div class="page-toolbar" style="padding-bottom: 5px;">
				<span οnclick="export_file()" class="fa fa-file-excel-o" style="font-size: 28px;cursor: pointer;" title="導出Excel"></span>
				<span  class="fa fa-file-pdf-o" style="font-size: 28px;cursor: pointer;" title="導出PDF"></span>
				<span  class="fa fa-file-word-o" style="font-size: 28px;cursor: pointer;" title="導出Word"></span>
			</div>
		</div>



六、零寬斷言:

1、(?=pattern) 零寬正向先行斷言(zero-width positive lookahead assertion) 

代表字符串中的一個位置,緊接該位置之後的字符序列能夠匹配pattern。 

如:(?=pattern) abc  代表匹配abc的同時,abc的後面必須有符合pattern的串;
2、(?!pattern) 零寬負向先行斷言(zero-width negative lookahead assertion) 

代表字符串中的一個位置,緊接該位置之後的字符序列不能匹配pattern。

如:(?!pattern) abc 代表匹配abc的同時,abc的後面不能有符合pattern的串;
3、(?<=pattern) 零寬正向後行斷言(zero-width positive lookbehind assertion) 

代表字符串中的一個位置,緊接該位置之前的字符序列能夠匹配pattern。 

如:(?<=pattern) abc 代表匹配abc的同時,abc的前面必須有符合pattern的串;
4、(?<!pattern) 零寬負向後行斷言(zero-width negative lookbehind assertion) 

代表字符串中的一個位置,緊接該位置之前的字符序列不能匹配pattern。 

如:(?<!pattern) abc 代表匹配abc的同時,abc的前面不能有符合pattern的串;


應用:

判斷某一個長字符串中,是否同時包含以下幾個子字符串:

比如,請判斷“上海請問北京請問天津請問重慶請問”中,是否同時包含:北京、天津、上海、重慶4個直轄市

正則:

(?=.*?上海)(?=.*?重慶)(?=.*?天津)(?=.*?北京)




發佈了32 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章