正則表達式

符號編輯

(摘自《 正則表達式之道》)
正則表達式[1]   由一些普通 字符和一些 元字符(metacharacters)組成。普通字符包括大小寫的字母和數字,而元字符則具備特殊的含義,咱們下面會給予解釋。
在最簡單的狀況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字符,它能夠匹配"testing"和"testing123"等字符串,可是不能匹配"Testing"。
要想真正的用好正則表達式,正確的理解元字符是最重要的事情。下表列出了全部的元字符和對它們的一個簡短的描述。
正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個 字符串來描述、匹配一系列符合某個句法規則的 字符串。在不少 文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。
許多程序設計語言都支持利用正則表達式進行字符串操做。例如,在 Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由 Unix中的工具軟件(例如sed和 grep)普及開的。正則表達式一般縮寫成「regex」, 單數有regexp、regex, 複數有regexps、regexes、regexen。

概念

正則表達式是對 字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。
給定一個正則表達式和另外一個字符串,咱們能夠達到以下的目的:
1. 給定的字符串是否符合正則表達式的過濾邏輯(稱做「匹配」);
2. 能夠經過正則表達式,從字符串中獲取咱們想要的特定部分。
正則表達式的特色是:
1. 靈活性、邏輯性和功能性很是的強;
2. 能夠迅速地用極簡單的方式達到字符串的複雜控制。
3. 對於剛接觸的人來講,比較晦澀難懂。
因爲正則表達式主要 應用對象是文本,所以它在各類 文本編輯器場合都有應用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,均可以使用正則表達式來處理文本內容。

引擎

正則引擎主要能夠分爲兩大類:一種是DFA,一種是NFA。這兩種引擎都有了好久的歷史(至今二十多年),當中也由這兩種引擎產生了不少變體!因而POSIX的出臺規避了沒必要要變體的繼續產生。這樣一來,主流的正則引擎又分爲3類:1、DFA,2、傳統型NFA,3、POSIX NFA。
DFA 引擎在線性時狀態下執行,由於它們不要求回溯(並所以它們永遠不測試相同的字符兩次)。DFA 引擎還能夠確保匹配最長的可能的字符串。可是,由於 DFA 引擎只包含有限的狀態,因此它不能匹配具備反向引用的模式;而且由於它不構造顯示擴展,因此它不能夠捕獲子表達式。
傳統的 NFA 引擎運行所謂的「貪婪的」匹配 回溯算法,以指定順序測試正則表達式的全部可能的擴展並接受第一個匹配項。由於傳統的 NFA 構造正則表達式的特定擴展以得到成功的匹配,因此它能夠捕獲子表達式匹配和匹配的反向引用。可是,由於傳統的 NFA 回溯,因此它能夠訪問徹底相同的狀態屢次(若是經過不一樣的路徑到達該狀態)。所以,在最壞狀況下,它的執行速度可能很是慢。由於傳統的 NFA 接受它找到的第一個匹配,因此它還可能會致使其餘(可能更長)匹配未被發現。
POSIX NFA 引擎與傳統的 NFA 引擎相似,不一樣的一點在於:在它們能夠確保已找到了可能的最長的匹配以前,它們將繼續回溯。所以,POSIX NFA 引擎的速度慢於傳統的 NFA 引擎;而且在使用 POSIX NFA 時,您恐怕不會願意在更改回溯搜索的順序的狀況下來支持較短的匹配搜索,而非較長的匹配搜索。
使用DFA引擎的程序主要有:awk,egrep,flex,lex,MySQL,Procmail等;
使用傳統型NFA引擎的程序主要有:GNU Emacs,Java,ergp,less,more,.NET語言,PCRE library,Perl,PHP,Python,Ruby,sed,vi;
使用POSIX NFA引擎的程序主要有:mawk,Mortice Kern Systems’ utilities,GNU Emacs(使用時能夠明確指定);
也有使用DFA/NFA混合的引擎:GNU awk,GNU grep/egrep,Tcl。
舉例簡單說明NFA與DFA工做的區別:
好比有字符串this is yansen’s blog,正則表達式爲 /ya(msen|nsen|nsem)/ (不要在意表達式怎麼樣,這裏只是爲了說明引擎間的工做區別)。 NFA工做方式以下,先在字符串中查找 y 而後匹配其後是否爲 a ,若是是 a 則繼續,查找其後是否爲 m 若是不是則匹配其後是否爲 n (此時淘汰msen選擇支)。而後繼續看其後是否依次爲 s,e,接着測試是否爲 n ,是 n 則匹配成功,不是則測試是否爲 m 。爲何是 m ?由於 NFA 工做方式是以正則表達式爲標準,反覆測試字符串,這樣一樣一個字符串有可能被反覆測試了不少次!
而DFA則不是如此,DFA會從 this 中 t 開始依次查找 y,定位到 y ,已知其後爲 a ,則查看錶達式是否有 a ,此處正好有 a 。而後字符串 a 後爲 n ,DFA依次測試表達式,此時 msen 不符合要求淘汰。nsen 和 nsem 符合要求,而後DFA依次檢查字符串,檢測到sen 中的 n 時只有nsen 分支符合,則匹配成功!
由此能夠看出來,兩種引擎的工做方式徹底不一樣,一個(NFA)以表達式爲主導,一個(DFA)以文本爲主導!通常而論,DFA引擎則搜索更快一些!可是NFA以表達式爲主導,反而更容易操縱,所以通常程序員更偏心NFA引擎! 兩種引擎各有所長,而真正的引用則取決與你的須要以及所使用的語言!
 

符號

(摘自《 正則表達式之道》)
正則表達式[1]   由一些普通 字符和一些 元字符(metacharacters)組成。普通字符包括大小寫的字母和數字,而元字符則具備特殊的含義,咱們下面會給予解釋。
在最簡單的狀況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字符,它能夠匹配"testing"和"testing123"等字符串,可是不能匹配"Testing"。
要想真正的用好正則表達式,正確的理解元字符是最重要的事情。下表列出了全部的元字符和對它們的一個簡短的描述。
元字符
描述
\
將下一個字符標記符、或一個向後引用、或一個八進制轉義符。例如,「\\n」匹配\n。「\n」匹配換行符。序列「\\」匹配「\」而「\(」則匹配「(」。即至關於多種編程語言中都有的「轉義字符」的概念。
^
匹配輸入字符串的開始位置。若是設置了RegExp對象的Multiline屬性,^也匹配「\n」或「\r」以後的位置。
$
匹配輸入字符串的結束位置。若是設置了RegExp對象的Multiline屬性,$也匹配「\n」或「\r」以前的位置。
*
匹配前面的子表達式任意次。例如,zo*能匹配「z」,「zo」以及「zoo」,可是不匹配「bo」。*等價於{0,}。
+
匹配前面的子表達式一次或屢次(大於等於1次)。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等價於{1,}。
?
匹配前面的子表達式零次或一次。例如,「do(es)?」能夠匹配「do」或「does」中的「do」。?等價於{0,1}。
{n}
n是一個非負整數。匹配肯定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,可是能匹配「food」中的兩個o。
{n,}
n是一個非負整數。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的全部o。「o{1,}」等價於「o+」。「o{0,}」則等價於「o*」。
{n,m}
m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,「o{1,3}」將匹配「fooooood」中的前三個o。「o{0,1}」等價於「o?」。請注意在逗號和兩個數之間不能有空格。
?
當該字符緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式則儘量多的匹配所搜索的字符串。例如,對於字符串「oooo」,「o+?」將匹配單個「o」,而「o+」將匹配全部「o」。
.點
匹配除「\r\n」以外的任何單個字符。要匹配包括「\r\n」在內的任何字符,請使用像「[\s\S]」的模式。
(pattern)
匹配pattern並獲取這一匹配。所獲取的匹配能夠從產生的Matches集合獲得,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用「\(」或「\)」。
(?:pattern)
非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供之後使用。這在使用或字符「(|)」來組合一個模式的各個部分是頗有用。例如「industr(?:y|ies)」就是一個比「industry|industries」更簡略的表達式。
(?=pattern)
非獲取匹配,正向確定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不須要獲取供之後使用。例如,「Windows(?=95|98|NT|2000)」能匹配「Windows2000」中的「Windows」,但不能匹配「Windows3.1」中的「Windows」。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始。
(?!pattern)
非獲取匹配,正向否認預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不須要獲取供之後使用。例如「Windows(?!95|98|NT|2000)」能匹配「Windows3.1」中的「Windows」,但不能匹配「Windows2000」中的「Windows」。
(?<=pattern)
非獲取匹配,反向確定預查,與正向確定預查相似,只是方向相反。例如,「(?<=95|98|NT|2000)Windows」能匹配「2000Windows」中的「Windows」,但不能匹配「3.1Windows」中的「Windows」。
(?<!pattern)
非獲取匹配,反向否認預查,與正向否認預查相似,只是方向相反。例如「(?<!95|98|NT|2000)Windows」能匹配「3.1Windows」中的「Windows」,但不能匹配「2000Windows」中的「Windows」。
x|y
匹配x或y。例如,「z|food」能匹配「z」或「food」或"zood"(此處請謹慎)。「(z|f)ood」則匹配「zood」或「food」。
[xyz]
字符集合。匹配所包含的任意一個字符。例如,「[abc]」能夠匹配「plain」中的「a」。
[^xyz]
負值字符集合。匹配未包含的任意字符。例如,「[^abc]」能夠匹配「plain」中的「plin」。
[a-z]
字符範圍。匹配指定範圍內的任意字符。例如,「[a-z]」能夠匹配「a」到「z」範圍內的任意小寫字母字符。
注意:只有連字符在字符組內部時,而且出如今兩個字符之間時,才能表示字符的範圍; 若是出字符組的開頭,則只能表示連字符自己.
[^a-z]
負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,「[^a-z]」能夠匹配任何不在「a」到「z」範圍內的任意字符。
\b
匹配一個單詞邊界,也就是指單詞和空格間的位置(即正則表達式的「匹配」有兩種概念,一種是匹配字符,一種是匹配位置,這裏的\b就是匹配位置的)。例如,「er\b」能夠匹配「never」中的「er」,但不能匹配「verb」中的「er」。
\B
匹配非單詞邊界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。
\cx
匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Z或a-z之一。不然,將c視爲一個原義的「c」字符。
\d
匹配一個數字字符。等價於[0-9]。
\D
匹配一個非數字字符。等價於[^0-9]。
\f
匹配一個換頁符。等價於\x0c和\cL。
\n
匹配一個換行符。等價於\x0a和\cJ。
\r
匹配一個回車符。等價於\x0d和\cM。
\s
匹配任何不可見字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。
\S
匹配任何可見字符。等價於[^ \f\n\r\t\v]。
\t
匹配一個製表符。等價於\x09和\cI。
\v
匹配一個垂直製表符。等價於\x0b和\cK。
\w
匹配包括下劃線的任何單詞字符。相似但不等價於「[A-Za-z0-9_]」,這裏的"單詞"字符使用Unicode字符集。
\W
匹配任何非單詞字符。等價於「[^A-Za-z0-9_]」。
\xn
匹配n,其中n爲十六進制轉義值。十六進制轉義值必須爲肯定的兩個數字長。例如,「\x41」匹配「A」。「\x041」則等價於「\x04&1」。正則表達式中可使用ASCII編碼。
\num
匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,「(.)\1」匹配兩個連續的相同字符。
\n
標識一個八進制轉義值或一個向後引用。若是\n以前至少n個獲取的子表達式,則n爲向後引用。不然,若是n爲八進制數字(0-7),則n爲一個八進制轉義值。
\nm
標識一個八進制轉義值或一個向後引用。若是\nm以前至少有nm個得到子表達式,則nm爲向後引用。若是\nm以前至少有n個獲取,則n爲一個後跟文字m的向後引用。若是前面的條件都不知足,若n和m均爲八進制數字(0-7),則\nm將匹配八進制轉義值nm。
\nml
若是n爲八進制數字(0-7),且m和l均爲八進制數字(0-7),則匹配八進制轉義值nml。
\un
匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(&copy;)。
< > 匹配詞(word)的開始(<)和結束(>)。例如正則表達式<the>可以匹配字符串"for the wise"中的"the",可是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是全部的軟件都支持的。
( ) 將( 和 ) 之間的表達式定義爲「組」(group),而且將匹配這個表達式的字符保存到一個臨時區域(一個正則表達式中最多能夠保存9個),它們能夠用 \1 到\9 的符號來引用。
| 將兩個匹配條件進行邏輯「或」(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",可是不能匹配"it belongs to them."。注意:這個元字符不是全部的軟件都支持的。
+ 匹配1或多個正好在它以前的那個字符。例如正則表達式9+匹配九、9九、999等。注意:這個元字符不是全部的軟件都支持的。
? 匹配0或1個正好在它以前的那個字符。注意:這個元字符不是全部的軟件都支持的。
{i} {i,j}

匹配指定數目的字符,這些字符是在它以前的表達式定義的。例如正則表達式A[0-9]{3} 可以匹配字符"A"後面跟着正好3個數字字符的串,例如A12三、A348等,可是不匹配A1234。而正則表達式[0-9]{4,6} 匹配連續的任意4個、5個或者6個數字javascript

最簡單的 元字符是點,它可以匹配任何單個字符(注意不包括換行符)。假定有個文件test.txt包含如下幾行內容:
he is arat
he is in a rut
the food is Rotten
I like root beer
咱們可使用grep命令來測試咱們的正則表達式,grep命令 使用正則表達式去嘗試匹配指定文件的每一行,並將至少有一處匹配表達式的全部行顯示出來。命令
grep r.t test.txt
在test.txt文件中的每一行中搜索正則表達式r.t,並打印輸出匹配的行。正則表達式r.t匹配一個r接着任何一個字符再接着一個t。因此它將匹配文件中的rat和rut,而不能匹配Rotten中的Rot,由於正則表達式是大小寫敏感的。要想同時匹配大寫和小寫字母,應該使用 字符區間 元字符(方括號)。正則表達式[Rr]可以同時匹配R和r。因此,要想匹配一個大寫或者小寫的r接着任何一個字符再接着一個t就要使用這個表達式:[Rr].t。
要想匹配行首的字符要使用抑揚字符(^)——有時也被叫作插入符。例如,想找到text.txt中行首"he"打頭的行,你可能會先用簡單表達式he,可是這會匹配第三行的the,因此要 使用正則表達式^he,它只匹配在行首出現的h。
有時候指定「除了×××都匹配」會比較容易達到目的,當抑揚字符(^)出方括號中時,它表示「排除」,例如要匹配he ,可是排除前面是t or s的情形(也就是the和she),可使用:[^st]he。
可使用方括號來指定多個字符區間。例如正則表達式[A-Za-z]匹配任何字母,包括大寫和小寫的;正則表達式[A-Za-z][A-Za-z]* 匹配一個字母后面接着0或者多個字母(大寫或者小寫)。固然咱們也能夠用 元字符+作到一樣的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*徹底等價。可是要注意元字符+ 並非全部支持正則表達式的程序都支持的。關於這一點能夠參考後面的正則表達式語法支持狀況。
要指定特定數量的匹配,要使用大括號(注意必須使用 反斜槓來轉義)。想匹配全部10和100的實例而排除1和 1000,可使用:10\{1,2\},這個正則表達式匹配數字1後面跟着1或者2個0的模式。在這個元字符的使用中一個有用的變化是忽略第二個數字,例如正則表達式0\{3,\} 將匹配至少3個連續的0。
正則表達式語法支持狀況
命令或環境
.
[ ]
^
$
\( \)
\{ \}
?
+
|
( )
vi
         
Visual C++
         
awk
 
awk是支持該語法的,只是要在命令
行加入 --posix or --re-interval參數便可,可見
man awk中的interval expression
sed
       
delphi
 
python
java
       
javascript
 
php
         
perl
 
C#
   

 

速記理解技巧

.
[ ]
^
$
四個字符是全部語言都支持的正則表達式,因此這個四個是基礎的正則表達式。正則難理解由於裏面有一個等價的概念,這個概念大大增長了理解難度,讓不少初學者看起來會蒙,若是把等價都恢復成原始寫法,本身書寫正則就超級簡單了,就像說話同樣去寫你的正則了:

  等價:
  ?,*,+,\d,\w 都是等價字符
  ?等價於匹配長度{0,1}
  *等價於匹配長度{0,} 
  +等價於匹配長度{1,}
  \d等價於[0-9]
  \W等價於[A-Za-z_0-9]。
經常使用運算符與表達式:
  ^ 開始
  () 域段
  [] 包含,默認是一個字符長度
  [^] 不包含,默認是一個字符長度
  {n,m} 匹配長度 
  . 任何單個字符(\. 字符點)
  | 或
  \ 轉義
  $ 結尾
  [A-Z] 26個大寫字母
  [a-z] 26個小寫字母
  [0-9] 0至9數字
[A-Za-z0-9] 26個大寫字母、26個小寫字母和0至9數字
  , 分割
  .
  
  分割語法:
  [A,H,T,W] 包含A或H或T或W字母
  [a,h,t,w] 包含a或h或t或w字母
  [0,3,6,8] 包含0或3或6或8數字

  語法與釋義:
  基礎語法 "^([]{})([]{})([]{})$"
  正則字符串 = "開始([包含內容]{長度})([包含內容]{長度})([包含內容]{長度})結束" 
  
  ?,*,+,\d,\w 這些都是簡寫的,徹底能夠用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)這種特殊組合狀況下除外。
  初學者能夠忽略?,*,+,\d,\w一些簡寫標示符,學會了基礎使用再按表本身去等價替換

  
  實例:
  字符串;tel:086-0666-88810009999
  原始正則:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$" 
  速記理解:開始 "tel:普通文本"[0-9數字]{1至3位}"-普通文本"[0數字][0-9數字]{2至3位}"-普通文本"[0-9數字]{8至11位} 結束"
  等價簡寫後正則寫法:"^tel:\d{1,3}-[0]\d{2,3}-\d{8,11}$" ,簡寫語法不是全部語言都支持。

 

替換技巧

實例目錄

【1】 正則表達式應用——替換指定內容到行尾
【2】 正則表達式應用——數字替換
【3】 正則表達式應用——刪除每一行行尾的指定 字符
【4】 正則表達式應用——替換帶有 半角括號的多行
【5】 正則表達式應用——刪除空行
【6】 正則表達式應用——實例應用

應用實例

【1】正則表達式應用——替換指定內容到行尾
原始文本以下面兩行
abc aaaaa
123 abc 444
但願每次遇到「abc」,則替換「abc」以及其後到行尾的內容爲「abc efg」
即上面的文本最終替換爲:
abc efg
123 abc efg
解決:
① 在替換對話框,查找內容裏輸入「abc.*」,替換內容輸入爲「abc efg」
② 同時勾選「正則表達式」 複選框,而後點擊「所有替換」按鈕
其中,符號的含義以下:
「.」 =匹配任意 字符
「*」 =匹配0次或更多
注意:其實就是正則表達式替換,這裏只是把一些曾經提出的問題加以整理,單純從正則表達式自己來講,就能夠引伸出成千上萬種特例。
【2】正則表達式應用——數字替換
但願把
asdadas123asdasdas456asdasdasd789asdasd
替換爲:
asdadas[123]asdasdas[456]asdasdasd[789]asdasd
在替換對話框裏面,勾選「正則表達式」 複選框
在查找內容裏面輸入「([0-9])([0-9])([0-9])」,不含引號
「替換爲:」裏面輸入「[\1\2\3]」,不含引號
####備註####:查找([0-9]+) 替換:[\1] 更簡單通用些
範圍爲你所操做的範圍,而後選擇替換便可。
實際上這也是正則表達式的使用特例,「[0-9]」表示匹配0~9之間的任何特例,一樣「[a-z]」就表示匹配a~z之間的任何特例
上面重複使用了「[0-9]」,表示連續出現的三個數字
括號用來選擇原型,進行分組,替換時要用
「\1」表明第一個「[0-9]」對應的原型,「\2」表明第二個「[0-9]」對應的原型,依此類推
「[」|「]」爲單純的 字符,表示添加「[」或「]」,若是輸入「其它\1\2\3其它」,則替換結果爲:
asdadas其它123其它asdasdas其它456其它asdasdasd其它789其它asdasd
功能加強:
若是將查找內容「[0-9][0-9][0-9]」改成「[0-9]*[0-9]」,對應1 或 123 或 12345 或 ...
你們根據須要定製
相關內容還有不少,能夠本身參考正則表達式的語法仔細研究一下
【3】正則表達式應用——刪除每一行行尾的指定 字符
由於這幾個字符在行中也是出現的,因此確定不能用簡單的替換實現
好比
12345 1265345
2345
須要刪除每行末尾的「345」
這個也算正則表達式的用法,其實仔細看正則表達式應該比較簡單,不過既然有這個問題提出,說明對正則表達式還得有個認識過程,解決方法以下
解決:
在替換對話框中,啓用「正則表達式」 複選框
在查找內容裏面輸入「345$」
這裏「$」表示從行尾匹配
若是從行首匹配,能夠用「^」來實現,不過 EditPlus 有另外一個功能能夠很簡單的刪除行首的字符串
a. 選擇要操做的行
b. 編輯-格式-刪除行註釋
c. 在彈出對話框裏面輸入要清除的行首 字符,肯定
【4】正則表達式應用——替換帶有半角括號的多行
幾百個網頁中都有下面一段代碼:
<script LANGUAGE="JavaScript1.1">
<!--
htmlAdWH('93163607', '728', '90');
//-->
</SCRIPT>
我想把它們都去掉,但是找了不少search & replace的軟件,都是隻能對「一行」進行操做。
EditPlus 打開幾百個網頁文件仍是比較順暢的,因此徹底能夠勝任這個工做。
具體解決方法,在 Editplus 中 使用正則表達式,因爲「(」、「)」被用作預設表達式(或者能夠稱做子表達式)的標誌,因此查找
「<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH('93163607', '728', '90'.);\n//-->\n</SCRIPT>\n」
時會提示查找不到,因此也就沒法進行替換了,這時能夠把「(」、「)」使用任意 字符標記替代,即 半角句號:「.」。替換內容爲
<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH.'93163607', '728', '90'.;\n//-->\n</SCRIPT>\n
在替換對話框啓用「正則表達式」選項,這時就能夠完成替換了
補充:
對( ) 這樣的特殊符號,應該用\( \)來表示,這也是很標準的regexp語法,能夠寫爲
<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH\('93163607', '728', '90'\);\n//-->\n</SCRIPT>\n
【5】正則表達式應用——刪除空行
啓動EditPlus,打開待處理的文本類型文件。
①、選擇「查找」菜單的「替換」命令,彈出 文本替換對話框。選中「正則表達式」 複選框,代表咱們要在查找、替換中 使用正則表達式。而後,選中「替換範圍」中的「 當前文件」,代表對當前文件操做。
②、單擊「查找內容」 組合框右側的按鈕,出現下拉菜單。
③、下面的操做添加正則表達式,該表達式表明待查找的空行。(技巧提示:空行僅包括 空格符製表符、回車符,且必須以這三個符號之一做爲一行的開頭,而且以回車符結尾,查找空行的關鍵是構造表明空行的正則表達式)。
直接在"查找"中輸入正則表達式「^[ \t]*\n」,注意\t前有空格符。
(1)選擇「從行首開始匹配」,「查找內容」組合框中出現字符「^」,表示待查找字符串必須出文本中一行的行首。
(2)選擇「 字符在範圍中」,那麼在「^」後會增長一對括號「[]」,當前 插入點在括號中。括號在正則表達式中表示,文本中的字符匹配括號中任意一個字符即符合查找條件。
(3)按一下空格鍵,添加 空格符。空格符是空行的一個組成成分。
(4)選擇「 製表符」,添加表明製表符的「\t」。
(5)移動 光標,將當前插入點移到「]」以後,而後選擇「匹配 0 次或更多」,該操做會添加星號字符「*」。星號表示,其前面的括號「[]」內的空格符或製表符,在一行中出現0個或多個。
(6)選擇「換行符」,插入「\n」,表示回車符。
④、「替換爲」 組合框保持空,表示刪除查找到的內容。單擊「替換」按鈕逐個行刪除空行,或單擊「所有替換」按鈕刪除所有空行(注意:EditPlus有時存在「所有替換」不能一次性徹底刪除空行的問題,多是程序BUG,須要多按幾回按鈕)。
【6】 正則表達式應用——實例應用
1.驗證用戶名和密碼:("^[a-zA-Z]\w{5,15}$")正確格式:"[A-Z][a-z]_[0-9]"組成,而且第一個字必須爲字母6~16位;
2.驗證電話號碼:("^(\\d{3,4}-)\\d{7,8}$")正確格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
3.驗證手機號碼:"^1[3|4|5|7|8][0-9]\\d{8}$";
4.驗證身份證號(15位或18位數字):"\\d{14}[[0-9],0-9xX]";
5.驗證Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
6.只能輸入由數字和26個英文字母組成的字符串:("^[A-Za-z0-9]+$") ;
7.整數或者小數:^[0-9]+([.][0-9]+){0,1}$
8.只能輸入數字:"^[0-9]*$"。
9.只能輸入n位的數字:"^\d{n}$"。
10.只能輸入至少n位的數字:"^\d{n,}$"。
11.只能輸入m~n位的數字:"^\d{m,n}$"。
12.只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。
13.只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"。
14.只能輸入有1~3位小數的正實數:"^[0-9]+(\.[0-9]{1,3})?$"。
15.只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。
16.只能輸入非零的負整數:"^\-[1-9][0-9]*$"。
17.只能輸入長度爲3的字符:"^.{3}$"。
18.只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。
19.只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。
20.只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。
21.驗證是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。
22.只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"。
23.驗證URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
24.驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式爲:"01"~"09"和"10"~"12"。
25.驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式爲;"01"~"09"、"10"~"29"和「30」~「31」。
26.獲取日期正則表達式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日?
評註:可用來匹配大多數年月日信息。
27.匹配雙 字節 字符(包括漢字在內):[^\x00-\xff]
評註:能夠用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
28.匹配空白行的正則表達式:\n\s*\r
評註:能夠用來刪除空白行
29.匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</>|<.*? />
評註:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的嵌套標記依舊無能爲力
30.匹配首尾空白 字符的正則表達式:^\s*|\s*$
評註:能夠用來刪除行首行尾的空白字符(包括空格、 製表符、換頁符等等),很是有用的表達式
31.匹配網址URL的正則表達式:[a-zA-z]+://[^\s]*
評註:網上流傳的版本功能頗有限,上面這個基本能夠知足需求
32.匹配賬號是否合法(字母開頭,容許5-16 字節,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評註:表單驗證時很實用
33.匹配騰訊QQ號:[1-9][0-9]{4,}
評註:騰訊QQ號從10 000 開始
34.匹配中國郵政編碼:[1-9]\\d{5}(?!\d)
評註:中國郵政編碼爲6位數字
35.匹配ip地址:([1-9]{1,3}\.){3}[1-9]。
評註:提取ip地址時有用
36.匹配MAC地址:([A-Fa-f0-9]{2}\:){5}[A-Fa-f0-9]
Function IsRegu(Regu,s)
'正則表達式校驗
If Regu="" Then
Exit Function
End if
Dim Re,Sre
Set Re = New RegExp
Re.Pattern = Regu
Sre = Re.Test(s)
If Sre = True Then
IsRegu = True
Else
IsRegu = False
End If
End Function
tmp=" "
if (IsRegu("\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*",tmp )) =false then
msgbox "E-mail地址不合法 !"
FieldCheck#N=false
不一樣的語言(如PHP和JAVA)、相同語言的不一樣類庫(如來自Sun的Java Regular Expression類庫跟Apache Jakarta的正則表達式類庫)間,用法會有所差異,在使用的時候,要注意這些差異。

驗證URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
functionIsValidUrl(str){
varregu= "^(https?://)"
+ "?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?"
+ "(([0-9]{1,3}\.){3}[0-9]{1,3}"
+ "|"
+ "([0-9a-z_!~*'()-]+\.)*"
+ "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\."
+ "[a-z]{2,6})"
+ "(:[0-9]{1,4})?"
+ "((/?)|"
+ "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$" ;
varre=newRegExp(regu);
if (!re.test(str)){
return  false ;
}
return  true ;
}

 

零寬斷言

用於查找在某些內容(但並不包括這些內容)以前或以後的東西,也就是說它們像\b,^,$那樣用於指定一個位置,這個位置應該知足必定的條件(即斷言),所以它們也被稱爲零寬斷言。最好仍是拿例子來講明吧:
(?=exp)也叫零寬度正預測先行斷言[3]   ,它斷言自身出現的位置的後面能匹配表達式exp。好比\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing之外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。
(?<=exp)也叫零寬度正回顧後發斷言[3]   ,它斷言自身出現的位置的前面能匹配表達式exp。好比(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re之外的部分),例如在查找reading a book時,它匹配ading。
假如你想要給一個很長的數字中每三位間加一個逗號(固然是從右邊加起了),你能夠這樣查找須要在前面和裏面添加逗號的部分:((?<=\D)\D{3})+\b,用它對xxxxxxxxxx進行查找時結果是xxxxxxxxx
下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)
斷言用來聲明一個應該爲真的事實。正則表達式中只有當斷言爲真時纔會繼續進行匹配。

負向零寬

若是咱們只是想要確保某個字符沒有出現,但並不想去匹配它時怎麼辦?例如,若是咱們想查找這樣的單詞--它裏面出現了字母q,可是q後面跟的不是字母u,咱們能夠嘗試這樣:
\b\w*q[^u]\w*\b匹配包含後面不是字母u的字母q的單詞。可是若是多作測試(或者你思惟足夠敏銳,直接就觀察出來了),你會發現,若是q出如今單詞的結尾的話,像Iraq,Benq,這個表達式就會出錯。這是由於[^u]總要匹配一個字符,因此若是q是單詞的最後一個字符的話,後面的[^u]將會匹配q後面的單詞分隔符(多是空格,或者是句號或其它的什麼),後面的\w*\b將會匹配下一個單詞,因而\b\w*q[^u]\w*\b就能匹配整個Iraq fighting。負向零寬斷言能解決這樣的問題,由於它只匹配一個位置,並不消費任何字符。,咱們能夠這樣來解決這個問題:\b\w*q(?!u)\w*\b。
零寬度負預測先行斷言(?!exp),斷言此位置的後面不能匹配表達式exp。例如:\d{3}(?!\d)匹配三位數字,並且這三位數字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字符串abc的單詞。
同理,咱們能夠用(?<!exp),零寬度負回顧後發斷言來斷言此位置的前面不能匹配表達式exp:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數字。
請詳細分析表達式(?<=<(\w+)>).*(?=<\/\1>),這個表達式最能表現零寬斷言的真正用途。
一個更復雜的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標籤內裏的內容。(?<=<(\w+)>)指定了這樣的前綴:被尖括號括起來的單詞(好比多是<b>),而後是.*(任意的字符串),最後是一個後綴(?=<\/\1>)。注意後綴裏的\/,它用到了前面提過的字符轉義,將」/「轉義;\1則是一個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣若是前綴其實是<b>的話,後綴就是</b>了。整個表達式匹配的是<b>和</b>之間的內容(再次提醒,不包括前綴和後綴自己)。

啓示

(1) 心中時刻保持新穎想法,嘗試用各類新辦法來解決遇到的問題。對於遇到的問題,在用常規的解決思路沒法解決或不能很好解決的時候,能夠大膽探索嘗試採用新的方法或思路來解決問題,說大點就是創新!沒有新思路估計今天的正則表達式還要等幾百年才能露現人間。
(2) 善於學習和借鑑前人的經驗和成果,UNIX鼻祖Ken Thompson是什麼樣子的人?是被計算機界尊稱爲「UNIX之父」的大師級別的人物,大師都在不斷思考從其它學科、其它知識領域的工做成果,來改進本身的工做或程序,事實也證實這樣作取得巨大結果和後來的深遠影響是事先誰也沒法預估到的,咱們在作一些事情或研究的時間,是否也考慮學習大師的優秀習慣?
(3) 學好數學、英語並保持對數學、英語的興趣,數學也是人類幾千年積累的智慧結晶,學習數學知識能夠培養和訓練人的思惟能力。看這篇文章的朋友,我想不少都是 計算機相關專業的朋友,至於數學和英語對於計算機學習和發展的重要性的道理,這裏就不在多說,重在實踐加鍥而不捨!
(4) 養成獨立思考的習慣。上學時候老師常常說人與動物的最大區別是人能思考。拉美洲有句關於「思考」的諺語是,不會思考的人是白癡,不願思考的人是懶漢,不敢思考的人是奴隸。我想你們和我同樣,既不肯作懶漢、奴隸,更不肯作白癡。因此相信正則分享網的朋友們必定會選擇作一個「會思、肯思、敢思」的人。
(5) 當正則表達式和字符串函數都能解決問題時,必定要使用字符串函數,這樣不容易出錯,最重要的是字符串函數比正則表達式實現性能上要好得多。

教程

正則表達式教程chm完整版是一本詳細介紹了正則表達式的電子書教程,全書共分爲8個小節,詳細的講述了正則表達式的定義,各類操做符的運算優先級,所有符號解釋,正則表達式匹配規則,參考文獻以及相關實例等,全書簡明扼要,可以很好的幫助讀者們正確掌握學習好正則表達式,從而在軟件編程中獲得更好的發揮。
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息