正則表達式入門ailk_第1頁
正則表達式入門ailk_第2頁
正則表達式入門ailk_第3頁
正則表達式入門ailk_第4頁
正則表達式入門ailk_第5頁
已閱讀5頁,還剩27頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、曹利鋒正則表達式是什么正則表達式是什么 描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某個子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。 一個正則表達式就是由普通字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式。該模式描述在查找文字主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。 我們用過的最簡單的規則:文件查找通配符:“?”和“*”正則表達式的作用1. 測試字符串的某個模式。例如,可以對一個輸入字符串進行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為數據有效性驗證。 2. 替

2、換文本。可以在文檔中使用一個正則表達式來標識特定文字,然后可以全部將其刪除,或者替換為別的文字。 3. 根據模式匹配從字符串中提取一個子字符串。可以用來在文本或輸入字段中查找特定文字。 第一個正則表達式第一個正則表達式 從英文小說中查找 hi 但不能把him,high,history也找到,可以用bhib b表示匹配一個單詞邊界,如果是 bhiw*,那就找到了him,high,history 假如你要找的是hi后面不遠處跟著一個Lucy,你應該用bhib.*bLucyb。 其中,.*連在一起就意味著任意數量的不包含換行的字符。第二個正則表達式 三位區號八位機號的電話號碼 0dd-ddddddd

3、d 其中d指的是數字 可以簡化為: 0d2-d8 中表示的是重復的次數。我們走到哪了?我們現在有以下正則表達式的元字符bwd.*這些都是什么意思?更進一步 d+匹配1個或更多連續的數字。下限是至少一次。 而*的下限是0次 再例: bw6b 匹配剛好6個字母/數字的單詞。常用的元字符 代碼代碼 說明說明 . 匹配除換行符以外的任意字符 w 匹配字母或數字或下劃線或漢字 s 匹配任意的空白符 d 匹配數字 b 匹配單詞的開始或結束 匹配字符串的開始 $ 匹配字符串的結束匹配QQ號 QQ號最少是5個數字,目前最長是12位數字字符轉義 要匹配正則表達式中用的字符,如 這就需要轉義,應當寫成 類似,我們

4、還有:. * + 等等常用的限定符 代碼代碼/語法語法 說明說明 *重復零次或更多次 +重復一次或更多次 ?重復零次或一次 n重復n次 n,重復n次或更多次 n,m重復n到m次字符范圍 xyz字符集合。匹配所包含的任意一個字符。 a-z字符范圍。匹配指定范圍內的任意字符。 所以 0-9代表的含意與d就是完全一致 同理 a-z0-9A-Z_ 也完全等同于w (當然,這種等同只能僅考慮英文) 例子:1.QQ號改正:QQ后首位不能為0 2.匹配(010)88886666,或02912345678反義 反義,有定義的元字符大寫,即是反義,同樣,字符集前加上也是反義。所以:代

5、碼代碼/語法語法 說明說明W匹配任意不是字母,數字,下劃線,漢字的字符S匹配任意不是空白符的字符D匹配任意非數字的字符B匹配不是單詞開頭或結束的位置x匹配除了x以外的任意字符a-z負值字符范圍。匹配任何不在指定范圍內的任意字符。并列 用|表示或者,把每一個規則分開,用|合并為一組共用。 例子:電話號碼可以是3位區號8位號碼,或4位區號7位號碼022-223344550477-7192112分組 字符可以指定重復次數,規則表達式如何指定重復次數? IP地址(d1,3.)3d1,3 (d1,3.)這部分是1到3位數字加“.”,用括號表示為一個子表達式,并且3表示重復3次。后向引用后向引用 使用小括

6、號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。 組號保存的結果,實際如同程序中變量或數組保存數據一樣。對組號的調用,如果是使用變量。后向引用示例后向引用示例 后向引用用于重復搜索前面某個分組匹配的文本。例如,1代表分組1匹配的文本。難以理解?請看示例: b(w+)bs+1b可以用來匹配重復的單詞,像go go, kitty kitty。首先是一個單詞,也就是單詞開始處和結束處之間的多于一個的字母或數字(

7、b(w+)b),然后是1個或幾個空白符(s+),最后還是前面匹配的那個單詞(1)。命名分組命名分組 ()內的子表達式,不僅可以用編號,也可以用名稱,如同變量有變量名。 (?w+) (?Wordw+) 或內均是分組名稱,這樣。下面的例子: b(?w+)bs+kb (?#變量聲明標志Word #變量名w+#表達式) 分組語法分組語法-捕獲捕獲 (exp)匹配exp,并捕獲文本到自動命名的組里 (?exp)匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?nameexp) (?:exp)匹配exp,不捕獲匹配的文本,也不給此分組分配組號零寬斷言表達式結構:(?=exp)匹配exp前面的位置

8、,即某表達式后面是exp(?=exp)匹配exp后面的位置,即某表達式前面是exp(?!exp)匹配后面跟的不是exp的位置,即某表達式后面不是exp(?!exp)匹配前面不是exp的位置,即某表達式前面不是exp 實例 bw+(?=ingb),匹配以ing結尾的單詞的前面部分(除了ing以外的部分):dancing,reading (?=bre)w+b會匹配以re開頭的單詞的后半部分(除了re以外的部分),read, return注釋 小括號的另一種用途是能通過語法(?#comment)來包含注釋。 如: (d1,2(?#0-99)|1dd(?#100-199)|20-4d(?#200-24

9、9)|250-5.)3(?#250-255) (d1,2 (?#-0-99) |1dd (?#100-199) |20-4d(?#200-249)|250-5)(?#250-255)$ 貪婪與懶惰 當正則表達式中包含能接受重復的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可盡可能多能多的字符。 考慮這個表達式:a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。貪婪與懶惰 有時,我們更需要懶惰匹配,也就是匹配盡可盡可能少能少的字符。 前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它后面加上一

10、個問號?。這樣.*?就意味著匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。貪婪與懶惰 對于aabab a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用于aabab的話,它會匹配aab和ab(為什么第一個匹配是aab而不是ab?簡單地說,因為正則表達式有另一條規則,比懶惰貪婪規則的優先級更高:最先開始的匹配最有最大的優先權懶惰限定符 *?重復任意次,但盡可能少重復 +?重復1次或更多次,但盡可能少重復 ?重復0次或1次,但盡可能少重復 n,m? 重復n到m次,但盡可能少重復 n,?重復n次以上,但盡可能少重復優先級順序 操作符 描述 轉義符 (), (?:),

11、(?=), 圓括號和方括號 *, +, ?, n, n, n,m 限定符 , $位置和順序 | “或”操作 JS中的應用 1.js里面通過RegExp類來實現正則表達式的。 /匹配串中第一個catvar reCat = new RegExp(cat); /匹配串中所有的catvar reCat = new RegExp(cat,g); /匹配串中所有的cat,不區分大消息 var reCat = new RegExp(cat,gi); var reCat = /cat/gi; /perl風格JSJS中的應用中的應用2.RegExp的方法 (1)test() 判斷是否匹配,返回 true 或者

12、false var sTomatch =cat; var reCat = /cat/; alert(reCat.test(sTomatch);/outputs true (2)exec() 返回一個數組,數組中的第一個條目是第一個匹配 var sTomatch = a bat, a Cat, a fAt baT, a faT cat; var reAt = /at/; var arrMatches = reAt.exec(sTomatch); alert(arrMatches.toString(); /outputs atJS中的應用String對象對正則表達式的支持 (1)match()方法

13、 var sTomatch = a bat, a Cat, a fAt baT, a faT cat; var reAt = /at/gi; var arrMatches = sTomatch.match(reAt); alert(arrMatches.toString(); /outputs at,at, At ,aT ,aT ,at; JS中的應用(2)replace()方法 var sToChange = “this red paper is not very red”; alert(sToChange.replace(“red”,“blue”); 只替換第一個“red”,outputs “this blue paper is not very red”要想全部替換,使用全程修正符,如下: var sToChange = this red paper is not very red; var reRed = /red/gi; alert(sToChange.replace(reRed,blue);JSJS中的應用中的應用 (3)split()方法 var sColor = “

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論