国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Regex > 正文

正則表達式 學習資料整理

2020-03-16 21:16:53
字體:
供稿:網(wǎng)友
正則表達式(Regular expression,簡寫為Regexes)是一種用來操作和檢驗字符串數(shù)據(jù)的強大工具。它相當與一串特殊的字符,用它可以轉(zhuǎn)換成算法,對文本進行匹配等操作。

1.正則表達式簡介

正則表達式(Regular expression,簡寫為Regexes)是一種用來操作和檢驗字符串數(shù)據(jù)的強大工具。它相當與一串特殊的字符,用它可以轉(zhuǎn)換成算法,對文本進行匹配等操作。

       事實上正則表達式有其自身的一套語法,這種語法對于初學者來說顯得有些晦澀難懂。尤其是其構(gòu)造比較困難,稱為很多入門者的障礙。但當掌握后卻可以輕易的解決以前不容易解決的很多文本類問題,如驗證提取等。

其常用場合有如下三種:

Ø        測試字符串的某個模式。例如,可以對一個輸入字符串進行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為數(shù)據(jù)有效性驗證。

Ø        替換文本。可以在文檔中使用一個正則表達式來標識特定文字,然后可以全部將其刪除,或者替換為別的文字。

Ø        根據(jù)模式匹配從字符串中提取一個子字符串。可以用來在文本或輸入字段中查找特定文字。      

2.正則表達式基礎(chǔ)語法

2.1匹配不同類型的字符

 

 

字符類

匹配的字符

/d

匹配一個數(shù)字字符。等價于 [0-9]

/D

匹配一個非數(shù)字字符。等價于 [^0-9]

/w

匹配包括下劃線的任何單詞字符。等價于'[A-Za-z0-9_]'

/W

匹配任何非單詞字符。等價于 '[^A-Za-z0-9_]'

/s

匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ /f/n/r/t/v]

/S

匹配任何非空白字符。等價于 [^ /f/n/r/t/v]

.(點號)

任一字符

[...]

括號中的任一字符

[^…]

非括號中的任一字符

 

2.2定位控制字符

 

^

其后的模式必須在字符串的開始處,如果是多行則在任一行的開始C#需要設(shè)定Multiline標志

$

前面的模式必須在一行的末尾,如果是多行,則在任意行的末尾

/A

前面的模式必須在字符串的開始處;多行標志被忽略

/z

前面的模式必須在字符串的末尾處,多行標志被忽略

/Z

前面的模式必須位于字符串的末尾或位于換行符前

/b

匹配一個單詞字符的開始,單詞字符是[a-zA-Z0-9]中的一位

/B

匹配一個非單詞邊界的位置, 不在一個單詞的開始

 

2.3指定重復字符

 

{n}

匹配前面的字符n

{n,}

匹配前面的字符最少n

{n,m}

匹配前面的字符nm

?

匹配前面的字符0次或1

+

匹配前面的字符至少1

*

匹配前面的字符至少0

 

2.4特殊控制類

 

|

指定字符替換,即該位置可以是|兩邊的任一個表達式

 

2.5 特殊字符轉(zhuǎn)義序列

 

//

匹配”/”

/.

匹配“.

/*

匹配“*

/(

匹配“(”

/)

匹配”)”

/?

匹配“?“

/+

匹配“+

/|

匹配“|

/{

匹配“{

/}

匹配“}

/^

匹配“^

/$

匹配“$

/n

匹配換行符

/r

匹配回車

/t

匹配Tab

/v

匹配垂直制表符

/f

匹配換頁符

/nnn

匹配一個三位八進制數(shù)指定的ASCII字符,如/103匹配C

/xnn

匹配一個二位16進制數(shù)指定的ASCII字符,例如/x43匹配C

/unnnn

匹配一個416進制數(shù)指定的Unicode字符

/cV

匹配一個控制字符,(如復制Ctrl+C

 

2.6正則表達式分組、替換、反向引用等高級應(yīng)用

以上只是正則表達式的基礎(chǔ)部分,從這里開始才算真正開始正則表達式之旅。

²       分組

分組技術(shù)可以匹配在一個組中的所有字符,用()來表示,是下面兩個技術(shù)的基礎(chǔ)所在。“()“又稱捕獲符號。

1.    捕獲:()

例子:ABC1EDF2UU

匹配組表達式:([A-Z]{3})/d  --匹配3個連續(xù)大寫字母和一個數(shù)字

匹配結(jié)果:1.ABC1,2.EDF2

如果用C#中的group,則為ABC,EDF。因為group搜集的是匹配組的內(nèi)容。
2.非捕獲(?:)

使用了非捕獲就說明該()中的內(nèi)容將不作為捕獲的組返回,而和其它表達式共同構(gòu)成匹配項返回。也就是捕獲組將不存在。

例:1AF3EDC

匹配表達式:(?:/d|[A-Z]/w  --匹配一個數(shù)字或字母加一個任意的字符。

匹配結(jié)果:1.1A 2.F3 3.ED

沒有組被捕獲

2.    通過名稱捕獲(?<name>

定義了名稱捕獲的組可以在反向匹配中運用名稱進行反向引用而不需要再使用數(shù)字進行反向捕獲。注意組名區(qū)分大小寫!

²       替換

替換,顧名思義,是將匹配的字符替換成其他指定的字符形式。這個功能是在分組的基礎(chǔ)上的(當然或許可以單獨存在,但是那樣匹配的功能顯然不夠強大)。在這里有一個技巧是使用附加的匹配字符控制匹配內(nèi)容。

 

$group

group指定的組號進行替換

${name}

替換由<?name>匹配的最后一個子串

$$

替換字符$

$&

替換整個的匹配

$+

替換最后捕獲的組

$

替換整個輸入的字符串

 

 

²       反向引用

反向匹配可以引用前面組中的匹配形式。“/匹配組的數(shù)字表示(1為基數(shù))“或者”/k<groupname>

²       高級組

1.    正聲明(?=

規(guī)定了括號中的模式必須出現(xiàn)在聲明的右側(cè)。模式將不構(gòu)成匹配的一部分。

2.    負聲明(?!

規(guī)定了括號中的模式不能出現(xiàn)在聲明的右側(cè),模式將不構(gòu)成匹配的一部分。

3.    反向正聲明(?<=

規(guī)定了括號中的模式必須出現(xiàn)在聲明的左側(cè),模式將不構(gòu)成匹配的一部分。

4.    反向負聲明(?<!

規(guī)定了括號中的模式必須出現(xiàn)在聲明的左側(cè)。模式不構(gòu)成匹配的一部分。

5.    非回溯(?>

防止了正則表達式引擎搜索失敗時回溯,這稱之為貪婪的子表達式。

如輸入字符串:He  was very trusting.

正則表達式:.*ing將匹配trusting但是如果加入(?>ing則不能完成匹配。

非回溯組也是非捕獲組。他對于提高正則表達式的效率很有效。

如匹配一個www.****.com的網(wǎng)址。使用www/.(.*)/.com顯然要比www/.([^.]*)/.com效率要低的多,因為前者必須使用組中的回溯操作,回溯是很艱難的過程,所以當使用非回溯的正則表達式時時可以顯著提高正則表達式的效率的。

其實正則表達式是只注重匹配結(jié)果的,所以會努力去匹配所存在的字符串。這就是它的貪婪性所在。(這點其實理解的不是太深)。

注意以上這些(1-5)都不能夠用于反向引用,因為以上聲明將不作為匹配的一部分。

2.7在正則表達式中做決策

高級決策的兩種寫法:

1=>(?(expressionyes|no)

2=>(?(?=expression)yes|no)

這兩種方式中的的expression匹配則后面進行匹配yes,否則匹配no

需要注意的一點是yes測試和決策測試是在同一個起點里進行的。

如以下字符串:77-77A 69-AA 57-B

匹配表達式為:(/d7)?-(?(1)/d/d[A-Z]|[A-Z][A-Z])

匹配結(jié)果為:

1.77-77A   2. –AA

這個正則表達式中用到了引用組,(?(1**)中的1也可以換為/1,這樣不影響匹配。這個匹配中如果將決策后面的/d/d去掉則會出現(xiàn)不同的結(jié)果,這時只會有一個-AA是匹配的。因為決策點和yes表達式是從同一個起點開始匹配所以即使決策點匹配了,但是后面的yes表達式仍然不匹配。就只匹配no部分的表達式。最終結(jié)果也必然改變,理解這一點很重要。

2.8 正則表達式的選項

快到結(jié)尾了,再說下正則表達式的選項。選項其實就是將正則表達式的設(shè)置改到組中來。如(?i:[a-z])將忽略大小寫進行匹配。實際上如果學過Javascript中的正則表達式,可以看出這個ijavascript中表示的還是這個意思。

 

N

規(guī)定只有顯示命名的組標號的組才能有效的捕獲

I

此選項匹配不區(qū)分大小寫的匹配

X

此選項規(guī)定,非轉(zhuǎn)義的空字符被排除在模式之外,并啟用了一個前綴#的注釋

M

指定多行模式,修改了^$的定義

S

指定單行模式

 

2.9正則表達式的規(guī)則

1.正則表達式會對輸入字符傳進行最快的匹配,它一次搜索一個字符,知道實現(xiàn)第一次匹配。

2.發(fā)現(xiàn)一個匹配的開始后,正則表達式引擎將繼續(xù)匹配,直到遇到一個不被模式接收的字符。

3.Regex引擎非常貪婪只要模式匹配它將匹配盡可能多的字符。

4.Regex渴望實現(xiàn)匹配,所以將在需要時回溯以實現(xiàn)匹配。

5.Regex引擎總是先選擇第一個選項。在|式表達式中。

以上的幾點很重要。到這正則表達式的幾乎所有規(guī)則也就講完了。

最后附一個懶惰匹配常用修飾和其他的限定

 

*

盡可能少地使用重復的第一個匹配

+

盡可能少地使用重復但至少使用一次

??

使用零次重復(如有可能)或一次重復

{n}

等同于{n}

{n, }?

盡可能少地使用重復但至少使用n

{n,m}?

介于nm之間,盡可能少地使用重復

 

作者:hanxing0的專欄 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 莆田市| 巴青县| 利津县| 九龙坡区| 安陆市| 洪湖市| 乌兰察布市| 揭阳市| 建宁县| 仁布县| 文登市| 邻水| 萨嘎县| 观塘区| 新和县| 田东县| 山阳县| 卓资县| 海门市| 新乐市| 平武县| 繁昌县| 阜新| 新疆| 赣州市| 商都县| 都昌县| 方山县| 永川市| 大英县| 景宁| 贵定县| 浪卡子县| 灵宝市| 桓台县| 莱州市| 中方县| 大兴区| 武平县| 乳山市| 普宁市|