常用正則表達(dá)式 整理篇
//www.5lwq4hdr.cn/article/17355.htm
正則表達(dá)式高級學(xué)習(xí)技巧
//www.5lwq4hdr.cn/article/9229.htm
1.正則表達(dá)式簡介
正則表達(dá)式(Regular expression,簡寫為Regexes)是一種用來操作和檢驗字符串?dāng)?shù)據(jù)的強(qiáng)大工具。它相當(dāng)與一串特殊的字符,用它可以轉(zhuǎn)換成算法,對文本進(jìn)行匹配等操作。
事實上正則表達(dá)式有其自身的一套語法,這種語法對于初學(xué)者來說顯得有些晦澀難懂。尤其是其構(gòu)造比較困難,稱為很多入門者的障礙。但當(dāng)掌握后卻可以輕易的解決以前不容易解決的很多文本類問題,如驗證提取等。
其常用場合有如下三種:
Ø 測試字符串的某個模式。例如,可以對一個輸入字符串進(jìn)行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為數(shù)據(jù)有效性驗證。
Ø 替換文本。可以在文檔中使用一個正則表達(dá)式來標(biāo)識特定文字,然后可以全部將其刪除,或者替換為別的文字。
Ø 根據(jù)模式匹配從字符串中提取一個子字符串。可以用來在文本或輸入字段中查找特定文字。
2.正則表達(dá)式基礎(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標(biāo)志 |
$ | 前面的模式必須在一行的末尾,如果是多行,則在任意行的末尾 |
/A | 前面的模式必須在字符串的開始處;多行標(biāo)志被忽略 |
/z | 前面的模式必須在字符串的末尾處,多行標(biāo)志被忽略 |
/Z | 前面的模式必須位于字符串的末尾或位于換行符前 |
/b | 匹配一個單詞字符的開始,單詞字符是[a-zA-Z0-9]中的一位 |
/B | 匹配一個非單詞邊界的位置, 不在一個單詞的開始 |
2.3指定重復(fù)字符
{n} | 匹配前面的字符n次 |
{n,} | 匹配前面的字符最少n次 |
{n,m} | 匹配前面的字符n至m次 |
? | 匹配前面的字符0次或1次 |
+ | 匹配前面的字符至少1次 |
* | 匹配前面的字符至少0次 |
2.4特殊控制類
| | 指定字符替換,即該位置可以是|兩邊的任一個表達(dá)式 |
2.5 特殊字符轉(zhuǎn)義序列
// | 匹配”/” |
/. | 匹配“.” |
/* | 匹配“*” |
/( | 匹配“(” |
/) | 匹配”)” |
/? | 匹配“?“ |
/+ | 匹配“+“ |
/| | 匹配“|“ |
/{ | 匹配“{“ |
/} | 匹配“}“ |
/^ | 匹配“^“ |
/$ | 匹配“$“ |
/n | 匹配換行符 |
/r | 匹配回車 |
/t | 匹配Tab鍵 |
/v | 匹配垂直制表符 |
/f | 匹配換頁符 |
/nnn | 匹配一個三位八進(jìn)制數(shù)指定的ASCII字符,如/103匹配C |
/xnn | 匹配一個二位16進(jìn)制數(shù)指定的ASCII字符,例如/x43匹配C |
/unnnn | 匹配一個4位16進(jìn)制數(shù)指定的Unicode字符 |
/cV | 匹配一個控制字符,(如復(fù)制Ctrl+C) |
2.6正則表達(dá)式分組、替換、反向引用等高級應(yīng)用
以上只是正則表達(dá)式的基礎(chǔ)部分,從這里開始才算真正開始正則表達(dá)式之旅。
² 分組
分組技術(shù)可以匹配在一個組中的所有字符,用()來表示,是下面兩個技術(shù)的基礎(chǔ)所在。“()“又稱捕獲符號。
1. 捕獲:()
例子:ABC1EDF2UU
匹配組表達(dá)式:([A-Z]{3})/d --匹配3個連續(xù)大寫字母和一個數(shù)字
匹配結(jié)果:1.ABC1,2.EDF2
如果用C#中的group,則為ABC,EDF。因為group搜集的是匹配組的內(nèi)容。
2.非捕獲(?:)
使用了非捕獲就說明該()中的內(nèi)容將不作為捕獲的組返回,而和其它表達(dá)式共同構(gòu)成匹配項返回。也就是捕獲組將不存在。
例:1AF3EDC
匹配表達(dá)式:(?:/d|[A-Z])/w --匹配一個數(shù)字或字母加一個任意的字符。
匹配結(jié)果:1.1A 2.F3 3.ED
沒有組被捕獲
2. 通過名稱捕獲(?<name>)
定義了名稱捕獲的組可以在反向匹配中運(yùn)用名稱進(jìn)行反向引用而不需要再使用數(shù)字進(jìn)行反向捕獲。注意組名區(qū)分大小寫!
² 替換
替換,顧名思義,是將匹配的字符替換成其他指定的字符形式。這個功能是在分組的基礎(chǔ)上的(當(dāng)然或許可以單獨存在,但是那樣匹配的功能顯然不夠強(qiáng)大)。在這里有一個技巧是使用附加的匹配字符控制匹配內(nèi)容。
$group | 用group指定的組號進(jìn)行替換 |
${name} | 替換由<?name>匹配的最后一個子串 |
$$ | 替換字符$ |
$& | 替換整個的匹配 |
$+ | 替換最后捕獲的組 |
$ | 替換整個輸入的字符串 |
² 反向引用
反向匹配可以引用前面組中的匹配形式。“/匹配組的數(shù)字表示(1為基數(shù))“或者”/k<groupname>“
² 高級組
1. 正聲明(?=)
規(guī)定了括號中的模式必須出現(xiàn)在聲明的右側(cè)。模式將不構(gòu)成匹配的一部分。
2. 負(fù)聲明(?!)
規(guī)定了括號中的模式不能出現(xiàn)在聲明的右側(cè),模式將不構(gòu)成匹配的一部分。
3. 反向正聲明(?<=)
規(guī)定了括號中的模式必須出現(xiàn)在聲明的左側(cè),模式將不構(gòu)成匹配的一部分。
4. 反向負(fù)聲明(?<!)
規(guī)定了括號中的模式必須出現(xiàn)在聲明的左側(cè)。模式不構(gòu)成匹配的一部分。
5. 非回溯(?>)
防止了正則表達(dá)式引擎搜索失敗時回溯,這稱之為貪婪的子表達(dá)式。
如輸入字符串:He was very trusting.
正則表達(dá)式:.*ing將匹配trusting但是如果加入(?>)ing則不能完成匹配。
非回溯組也是非捕獲組。他對于提高正則表達(dá)式的效率很有效。
如匹配一個www.****.com的網(wǎng)址。使用www/.(.*)/.com顯然要比www/.([^.]*)/.com效率要低的多,因為前者必須使用組中的回溯操作,回溯是很艱難的過程,所以當(dāng)使用非回溯的正則表達(dá)式時時可以顯著提高正則表達(dá)式的效率的。
其實正則表達(dá)式是只注重匹配結(jié)果的,所以會努力去匹配所存在的字符串。這就是它的貪婪性所在。(這點其實理解的不是太深)。
注意以上這些(1-5)都不能夠用于反向引用,因為以上聲明將不作為匹配的一部分。
2.7在正則表達(dá)式中做決策
高級決策的兩種寫法:
1=>(?(expression)yes|no)
2=>(?(?=expression)yes|no)
這兩種方式中的的expression匹配則后面進(jìn)行匹配yes,否則匹配no。
需要注意的一點是yes測試和決策測試是在同一個起點里進(jìn)行的。
如以下字符串:77-77A 69-AA 57-B
匹配表達(dá)式為:(/d7)?-(?(1)/d/d[A-Z]|[A-Z][A-Z])
匹配結(jié)果為:
1.77-77A 2. 主站蜘蛛池模板: 欧美在线播放一区 | av影音在线| 九九九九精品九九九九 | 久久久综合视频 | 一区二区三区精品 | 亚洲无限乱码一二三四麻 | 成人影院一区二区三区 | 成人午夜av | 蜜臀在线视频 | 91香蕉视频在线观看 | 国产精品毛片一区二区在线看 | 三级成人 | 久色| 国产精品一级毛片在线 | 日本一本视频 | 国产欧美在线视频 | 精品欧美激情在线观看 | 精品日韩中文字幕 | 亚洲福利在线播放 | 免费看黄视频网站 | 国产福利精品在线 | 中文在线观看www | 久久久久国产精品视频 | 韩日欧美 | 亚州视频在线 | 久久久精品网站 | 视频在线观看一区 | 久久成人一区 | 欧美一区2区三区4区公司二百 | 狠狠狠干 | 免费av毛片 | 亚洲男人的天堂网站 | 嫩草91 | 久久综合狠狠综合久久综合88 | 国产精品久久精品 | 色天天综合久久久久综合片 | 成人在线一区二区三区 | 亚洲精品一区在线观看 | 久久久久久久久久久久久久久 | 极品女神高潮呻吟av久久 | 日本在线网 |