中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

正則表達(dá)式之基本概念

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用

正則表達(dá)式之基本概念

在我們寫頁面時(shí),往往需要對(duì)表單的數(shù)據(jù)比如賬號(hào)、身份證號(hào)等進(jìn)行驗(yàn)證,而最有效的、用的最多的便是使用正則表達(dá)式來驗(yàn)證。那什么是正則表達(dá)式呢?

正則表達(dá)式(Regular Expression) 是用于描述一組字符串特征的模式,用來匹配特定的字符串。 它的應(yīng)用非常廣泛,特別是在字符串處理方面。其常見的應(yīng)用如下:

  1. 驗(yàn)證字符串,即 驗(yàn)證給定的字符串或子字符串是否符合指定的特征, 例如,驗(yàn)證是否是合法的郵件地址、驗(yàn)證是否是合法的HTTP地址等等。
  2. 查找字符串,從給定的文本當(dāng)中 查找符合指定特征 的字符串,這樣比查找固定字符串更加靈活。
  3. 替換字符串,即查找到符合某特征的字符串之后將之替換。
  4. 提取字符串,即從給定的字符串中提取符合指定特征的子字符串。

第一部分:正則表達(dá)式之工具

正所謂工欲善其事必先利其器! 所以我們需要知道下面幾個(gè)主要的工具:

  • http://www.regexpal.com/      這個(gè)網(wǎng)站中,我們可以在線測(cè)試正則表達(dá)式。
  • http://regexr.com/   這個(gè)網(wǎng)站更為推薦,它自身還包括了一個(gè)實(shí)例使我們直接測(cè)試。

第二部分:正則表達(dá)式之元字符

正則表達(dá)式中元字符恐怕是我們聽得最多的了。 元字符 (Metacharacter)是一類非常特殊的字符,它 能夠匹配 一個(gè) 位置 或者字符集合中的一個(gè) 字符 。 如.、\w等都是元字符。

剛剛說到,元字符既可以匹配位置,也可以匹配字符,那么我們就可以通過此來將 元字符分為匹配位置的元字符匹配字符的元字符 。

A 匹配位置的元字符--- ^ 、 $ 、 \b

匹配位置 的元字符只有^( 脫字符號(hào) )、$( 美元符號(hào)) 和\b這三個(gè)字符。分別匹配 行的開始、行的結(jié)尾 以及 單詞的開始 或 結(jié)尾 。它們匹配的都只是位置。

1.^匹配行的開始位置

^zzw匹配的是 以"zzw"為行開頭的 "zzw"   (注意:我這里想要表達(dá)的是:盡管加了一個(gè)^,它匹配的仍是字符串,而不是一整行!) ,如果zzw不是作為行開頭的字符串,則它不會(huì)被匹配。

2.$匹配行的結(jié)尾位置

如 zzw$匹配的是 以"zzw"為行結(jié)尾的 "zzw" (同樣,這里$只是匹配的一個(gè)位置,那個(gè)位置是 零寬度, 而不是一整行),如果zzw不是作為行的結(jié)尾,那么它不會(huì)被匹配。

于是結(jié)合^和$我們就不難猜測(cè)^zzw$匹配的是某行中只有zzw這個(gè)字符串了。

而^$匹配的則是一個(gè)空行,這個(gè)空行中不包含任何字符串。

3.   \b匹配單詞的開始或結(jié)束

如 \bzzw匹配的是zzw之前是空格符號(hào)、標(biāo)點(diǎn)符號(hào)或換行符號(hào)的zzw(注意:但\b匹配的僅是一個(gè) 零寬度的位置, 而不會(huì)匹配空格、標(biāo)點(diǎn)符號(hào)或換行符號(hào))。

而zzw\b匹配的是zzw之后是空格符號(hào)、標(biāo)點(diǎn)符號(hào)或換行符號(hào)的zzw(同樣,\b匹配的是 一個(gè)零寬度的位置 )。

顯然 \bzzw\b匹配的就是zzw的前后必須是空格符號(hào)、標(biāo)點(diǎn)符號(hào)或換行符號(hào)的zzw。

B 匹配字符的元字符--- . 、\ w 、\ W 、\ s 、\ S 、\ d 、\ D

即匹配字符的元字符共有七個(gè)。

其中 .(點(diǎn)號(hào)) 表示匹配 除換行符之外 的任意字符;

\w 匹配單詞字符( 不僅僅是字母,還有下劃線、 數(shù)字漢字 );\W匹配任意的非單詞字符(注意,與\w剛好相反)

\s匹配的是任意的空白字符(如空格、制表符、換行符、中文全角空格等);

\S匹配的是任意的非空白字符(注意:剛好和\s相反);

\d匹配任意的數(shù)字;

\D匹配任意的非數(shù)字字符(注意:剛好和\d相反)。

例子如下所示:

上面的四個(gè)例子從左到右依次表示:

  • ^.$表示匹配一行中的唯一一個(gè)任意的非換行符的字符
  • \ba\w\w\w\w\w\w\w\w\w\b表示匹配以字母a開始的后面有9個(gè)字母字符的單詞。  ( 注意:其中的a并不是元字符,就是一個(gè)普通的字符,我們稱之為字符串字面值(string literal)-所謂字符串字面值,就是字面上看起來是什么就是什么)
  • \ b\w\w\w\d\d\d\d\D\b表示匹配以3個(gè)字母字符開始后面緊跟著四個(gè)數(shù)字字符且最后一個(gè)不是數(shù)字字符的單詞。

第三部分:正則表達(dá)式之文字匹配

這一部分我們將通過字符類、字符轉(zhuǎn)義、反義這幾個(gè)部分來學(xué)習(xí)。

A、字符類

字符類是正則表達(dá)式中的“迷你”語言,可以在[]中定義。

最簡(jiǎn)單的字符類可以由[]和幾個(gè)簡(jiǎn)單的字母組成。比如[aeiou]可以匹配aeiou五個(gè)字母中的 任意一個(gè) 。[0123456]可以匹配0123456這七個(gè)數(shù)字中的 任意一個(gè)。 而<H[123456]>可以匹配到HTML標(biāo)記中的<H1><H2><H3><H4><H5><H6>中的 任意一個(gè) 標(biāo)記。而[bhc]at就會(huì)匹配字符串bat、hat、cat。 也就是說字符類[]中的多個(gè)字符只會(huì)匹配其中一個(gè)。

但是顯然[0123456]、<H[123456]>這樣的表示太麻煩,需要寫的很多,所以我們 可以使用 -連字符)來簡(jiǎn)寫之 ,如[0-6]和<H[1-6]>。于是可知[0-9]和\d的作用是一樣的。[a-z]可以表示所有的小寫字母,[A-Z]可以表示所有的大寫字母。[a-zA-Z]可以表示所有的大寫字母和小寫字母。

值得注意的是 -(連字符) 只有在字符類中的中間位置時(shí)才是“到”的意思。而[-b]5中-沒有在兩個(gè)字符之間,所以它表示的是-5或者b5。

除此之外,我們知道^時(shí)只匹配行的開頭,但是 如果^出現(xiàn)在字符類中的第一個(gè)位置,那么它表示否定該字符類。 如[^123]表示匹配不是數(shù)字1或2或3的其他任意字符。[^-]表示匹配不是-的任意字符。

由此我們也可以發(fā)現(xiàn): 在字符類中使用元字符(-、^等)時(shí),不需要進(jìn)行轉(zhuǎn)義運(yùn)算。

更常用的有[^aeiou]匹配元音之外的字符、[0-9a-zA-Z_]匹配任何數(shù)字、字母(大寫和小寫)和下劃線,這等同于\w、[^ 0-9a-zA-Z_]匹配任何非數(shù)字、字母(大寫和小寫)和下劃線,這等同于\W。

B、字符轉(zhuǎn)義

我們知道元字符如&、^、.等都表示著特殊的涵義,如果我們希望把他們看作一般的字符去匹配字符串,并且恰好他們又都不在字符類(如[&]中),我們就需要使用\(反斜杠)進(jìn)行轉(zhuǎn)義了。

如我們可以使用www.cnblogs.com來匹配www.cnblogs.com。   我們可以用\*來匹配字符串中的*(通配符)。 我們還可以通過\\來匹配\。舉例如下所示:

C.反義

實(shí)際上我們?cè)谇懊嬉呀?jīng)說過了,這里再說一遍是因?yàn)橄M梢砸鹱⒁猓碸再字符類中的最前面時(shí)表示對(duì)這個(gè)字符類中的字符表示否定。如a[^b]匹配a和a后面不是b的字符。又如<asp[^>]>表示匹配<asp和其后面的字符不是>的字符。舉例如下:

第四部分:正則表達(dá)式之限定符

什么是限定符呢? 我們知道,在前面的例子中,我曾經(jīng)使用過\ba\w\w\w\w\w\w\w\w\w\b表示匹配以字母a開始的后面有9個(gè)字母字符的單詞,顯然這樣寫是十分麻煩的,如果我們能把\w這些重復(fù)的用簡(jiǎn)單的形式來寫就好了~ 沒錯(cuò),限定符就是干這個(gè)的,利用限定符我們可以重新寫成\ba\w{9}\b。對(duì),就是這么簡(jiǎn)單! 下面讓我們了解更多吧。

  • {n}  表示重復(fù)n次,如\w{5}表示匹配個(gè)單詞字符。
  • {n,} 表示重復(fù)至少n次,如\w{5}表示匹配至少5個(gè)單詞字符,也可以是6個(gè),7個(gè)……
  • {n,m} 表示重復(fù)至少n次,最多m次,如\w{5,10} 表示匹配至少5個(gè),最多10個(gè)單詞字符。
  • *  表示重復(fù)至少0次。 等同于{0,} ,即hu*t可以匹配ht或hut或huut或huuut……
  • +  表示重復(fù)至少1次。 等同于{1,},即hu+t可以匹配 hut或huut或huuut……
  • ?   表示重復(fù)0次或1次。等同于{0,1},即colou?r表示匹配color或者是colour。

顯然,上面的限定符所指的i安定都是限定的前面的某一個(gè)字符。

但是,如果我們?cè)谏厦娴南薅ǚ蠹由弦粋(gè)?呢 ,這時(shí)我們稱之為 懶惰限定符 。 相應(yīng)地,我們稱上面幾種匹配為貪婪匹配。

  • {n}? 等同于{n}
  • {n,}?   盡可能少的使用重復(fù),但至少使用n次
  • {n,m}?  重復(fù)n次到m次之間,但要盡可能少的使用重復(fù)。
  • *? 盡可能少的使用重復(fù)的第一個(gè)匹配
  • +? 盡可能少的使用重復(fù),但至少使用1次
  • ??  使用零次重復(fù)(如果有可能)或者一次重復(fù)

比如:對(duì)于aabab這個(gè)要 匹配的字符串而言,使用a.*b會(huì)匹配aabab,而如果使用a.*?b就會(huì)匹配aab和ab,而不是匹配所有。

第五部分:正則表達(dá)式之字符的運(yùn)算

字符的運(yùn)算包括替換、分組和反向引用,下面我將逐項(xiàng)介紹。

A 替換

什么是替換呢?  顯然就是指一個(gè)不行,我用另一個(gè)來替換,比如0\d{3}-\d{7}|0\d{2}-\d{8} 就表示匹配前4位為區(qū)號(hào)、后7位為本地號(hào)碼的電話號(hào)碼, 亦可 匹配前3位為區(qū)號(hào)、后8位為本地號(hào)碼的電話號(hào)碼。| 表示的就是替換了。  又如[Jj]ack和Jack|jack的匹配效果是一樣的都是用來匹配Jack或jack的。 也就是說,替換|是或運(yùn)算的關(guān)系。

在一般的或運(yùn)算中0 0結(jié)果為0, 0 1結(jié)果為1, 1 0結(jié)果為1,  1 1結(jié)果為1。那么在正則表達(dá)式中同樣是這樣, 如果一個(gè)都匹配不上就不匹配;如果有一個(gè)能匹配上就匹配一個(gè);如果兩個(gè)都能匹配上,就匹配兩個(gè) 。   舉例如下所示:

B.分組

正則表達(dá)式中,分組也是一個(gè)非常重要的概念?此茝(fù)雜,實(shí)際上

分組就是使用"("和")",即左圓括號(hào)和右圓括號(hào)將某些字符括起來看成一個(gè)整體來處理。

比如我們希望匹配abcabc。如果是abc{3}匹配的就是abccc,這不能達(dá)到預(yù)期,所以我們可以對(duì)abc分組,即(abc){3}就可以匹配到我們想要的字符串了。

又如(\d{1,3}\.){3}\d{1,3}也用了分組的運(yùn)算方式,它可以用來匹配簡(jiǎn)單的IP地址,如下所示:

C  反向引用

上面我們通過()可以進(jìn)行分組,而 分組的同時(shí),每一個(gè)組被自動(dòng)賦予了一個(gè)組號(hào),該組號(hào)可以代表該組的表達(dá)式。

編組的規(guī)則是:從左到右、以分組的左括號(hào)"("為標(biāo)志,第一個(gè)分組的組號(hào)為1,第二個(gè)分組的組號(hào)為2,以此類推。

這時(shí),反向引用就派上用場(chǎng)啦。我們就可以用它來 反向引用 使用()括起來的字符組了。具體怎么引用呢?規(guī)則如下:

  1. \數(shù)字,使用數(shù)字命名的反向引用。注:這個(gè)是通用的一種方式。
  2. \k<name>,使用指定命名的反向引用。注:這個(gè)是.NET Frameword支持的一種方式。

下面的幾個(gè)例子是 使用數(shù)字命名的反向引用

其中我們可以看到第一個(gè)和第二個(gè)匹配的并不相同---第一個(gè)匹配的是兩個(gè)任意單詞字符組成的單詞,而第二個(gè)由于是使用了反向引用,那么它就必須是兩個(gè)重復(fù)單詞字符組成的單詞。

最后一個(gè)我使用了兩個(gè)分組,根據(jù)分組規(guī)則可知\w{3}\d{2}是第一個(gè)分組,\d{2}是第二個(gè)分組。 同樣注意:反向引用的是同樣的字符,如www55www5566,最后兩位不同,這就無法正確匹配了。

使用指定命名(也就是自定義命名)的反向引用

對(duì)于上面的第二個(gè)例子,我們用自定義命名的反向引用可以寫成\b (?<myName>\w)\k<myName> \b或者是 \b (? 'myName' \w)\k<myName> \b。 本想舉例試一下,結(jié)果都提示錯(cuò)誤,可能是上面提到的兩個(gè)在線網(wǎng)站不支持吧~

當(dāng)然,如果我們希望只是將之看作一個(gè)整體,而 不希望給其編號(hào) ,可以使用(?:expression)的方式。如下所示:

另外,下面幾個(gè)也是常用的分組:

  • (?=expression)匹配字符串expression前面的位置
  • (?!expression)匹配后面不是字符串expression的位置
  • (?<=expression)匹配字符串expresssion后面的位置
  • (?<!expression)匹配前面不是字符串expression的位置
  • (?>expression)只匹配字符串expression一次 

D.零寬度斷言

之前介紹的^和$都是匹配的一個(gè)滿足一定條件的位置。這里把滿足的一個(gè)條件成為斷言或零寬度斷言。

常用的有:

  • ^  匹配行的開始位置
  • $   匹配行的結(jié)束位置
  • \A    匹配必須出現(xiàn)在字符串的開頭
  • \Z    匹配必須出現(xiàn)在字符串的結(jié)尾或字符串結(jié)尾處的\換行符好n之前
  • \z    匹配必須出現(xiàn)在字符串的結(jié)尾
  • \G   匹配必須出現(xiàn)在上一個(gè)匹配結(jié)束的地方
  • \b   匹配字符的開始或結(jié)束位置
  • \B   匹配不是在字符的開始或結(jié)束位置

之前所提到的(?=expression)、(?!expression)、(?<=expression)、(?<!expression)也都是匹配一個(gè)位置。

其中(?=expression)稱為零寬度預(yù)測(cè)先行斷言,它斷言自身位置的后面能夠匹配表達(dá)式expression。如\b\w+(?=ed\b)可以匹配以字符串ed結(jié)尾的單詞的前面部分,如reseted中的reset。

其中(?<=expression)又稱為零寬度正回顧后發(fā)斷言,它斷言自身位置的前面能夠匹配表達(dá)式expression。如(?<=\ban)\w+\b可以匹配除字符串a(chǎn)n之外的部分。

E 負(fù)向零寬度斷言

(?!expression)稱為負(fù)向零寬度斷言,即斷言自身位置的后面不能匹配字符串expression。

如\b\w{3}(?!\d) 匹配的是后面不是數(shù)字的以三個(gè)單詞字符開頭的三個(gè)單詞字符 。如下所示:

F 優(yōu)先級(jí)順序

正則表達(dá)式中存在元字符、轉(zhuǎn)義符、限定符、|等運(yùn)算或表達(dá)式。在匹配過程中,正則表達(dá)式都事先規(guī)定了這些運(yùn)算或表達(dá)式的優(yōu)先級(jí)。 正則表達(dá)式也可以像數(shù)學(xué)表達(dá)式一樣來求值。也就是說,正則表達(dá)式可以從左到右、并按照一個(gè)給定的優(yōu)先級(jí)來求值。

優(yōu)先級(jí)順序表(優(yōu)先級(jí)由高到低)如下:

  1. 轉(zhuǎn)義符:\
  2. 圓括號(hào)和方括號(hào):()、(?:)、(?=)、[]
  3. 限定符: *、+、?、{n}、{n,}、{n,m}
  4. 位置和順序:^、$、\(元字符)
  5. 或運(yùn)算:|

 我們可以看到或運(yùn)算的優(yōu)先級(jí)是最低的。

第六部分:典型正則表達(dá)式解釋

A 匹配windows運(yùn)算系統(tǒng)的名稱

我們可以通過下面的正則表達(dá)式來精確匹配windows運(yùn)算系統(tǒng)的名稱

        windows\s*((95)|(98)|(2000)|(2003)|(ME)|(XP)|(7)|(8)|(10))

這樣就可以精準(zhǔn)匹配windows的各種版本的運(yùn)算系統(tǒng)了,顯然這個(gè)是非常冗長(zhǎng)的,我們還可以用一種不精準(zhǔn)的方式匹配,如下所示:

        windows\s*\w+

其中s*表示至少重復(fù)0次。即windows10(無空格), windows 10(一個(gè)空格), windows  10(兩個(gè)空格)等都可以正確匹配。

B 匹配HTML標(biāo)記

HTML標(biāo)記一般由尖括號(hào)包圍,如<a>、<table>、<input>等等。所以我們可以使用下面的正則表達(dá)式來匹配HTML標(biāo)記。

       <[a-zA-Z][^>]*>

 

來自:http://www.cnblogs.com/zhuzhenwei918/p/6196661.html

 

標(biāo)簽:

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:Android 反編譯初探 應(yīng)用是如何被注入廣告的

下一篇:Android控件布局屬性全解(必看必會(huì))