02.正則表達式

準備:git

—安裝RegExpBuddy軟件——專門測試正則表達式是否正確的軟件程序員

—或是找一個正則表達式在線測試網站正則表達式

1.正則表達式——Regular Expression測試

什麼是:網站

  正則表達式,是專門描述字符串中字符出現規則的表達式。spa

爲何:blog

  由於程序不認識人類語言中的詞彙,因此才須要程序員用正則表達式教程序認識人類語言中的詞彙。教程

可用於:圖片

  1.驗證字符串格式字符串

  2.查找敏感詞

定義正則表達式:

  (1).普通字符

   全部的單個大小寫字母、數字都是一個正則表達式,用以匹配單個字符,這個字符與它自己相同,簡單來說,就是一個關鍵詞原文。

   —例如:"我是"

  

關鍵詞匹配的過程:

  

在RegExp Buddy中

—查找一句話中是否包含敏感詞「我是」

—若是將一句話中的「我是」,換成「我事」,還能查詢出來嗎?

(2).字符集

問題:

  第二個字符換成另外一個同音字,就匹配不到了

解決:

  字符集

什麼是:

—字符集是規定一位字符上多種備選字的列表

—只要規則中某一位字符上有多種備選字時,就用字符集

如何:

  [備選字列表]

例如:

  匹配時,只要與[]中任意一個字符匹配,就算知足規則

字符集匹配過程:

  

若是再連上前邊寫死的「我」字規則,可匹配種詞:

  

在RegExp Buddy中

—定義一個規則同時匹配「我是」 ,「我事」 ,「我時」 三種敏感詞

答案: [是時事]

—擴展:修改規則,使其進一步匹配「臥是」

答案: [我臥][是時事]

—[我臥][是事時]匹配過程: 

  

再例如:

經常使用手機號規則:

— 第一位:1

— 第二位:三、四、五、六、七、八、9中選其中一個

— 後 9位:每一位上都是在0~9數字之間任選其一

—結果:

  

問題:

  若是每一個數字都寫很麻煩。

解決:

  簡寫:若是[]中部分備選字符連續,可使用-省略中間字符

例如:

          手機號規則中:

[3456789] 可簡寫爲 [3-9] 讀做 39

[0123456789] 可簡寫爲 [0-9] 讀做 09

  因此,手機簡寫形式:

    1[3-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

  

其它簡寫:

要匹配 一位小寫 字母 : [a-z]             26

要匹配 一位大寫 字母 : [A-Z]             26

要  匹  配 一 位 字 母 : [A-Za-z]        52

要匹配一位字母或數字:[0-9A-Za-z]    62

要  匹  配  一 位 漢 字:[\u4e00-\u9fa5]

                                 19968 ~ 40869  20902

使用字符集簡寫:

在RegExp Buddy中

  

—利用字符集簡寫定義車牌號規則:

— 第一位:1位漢字

— 第二位:1位大寫字母

— 第三位:·

— 後五位:每一位都是一位大寫字母或數字

答案:

  [\u4e00-\u9fa5][A-Z]·[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]

 

(3).預約義字符集

正則表達式語法爲四種最經常使用的字符集定義了最簡化寫法,稱爲預約義字符集。

包括:

要  匹  配  一  位  數 字  : \d   等效於   [0-9]  

要匹配一位字母、數字或_:  \w   等效於   [0-9A-Za-z_]

要  匹 配 一 位 空 字  符 :\s    可匹配  空格、製表符、Tab等空白

要匹配全部文字 (通配符) : .  

因此,利用預約義字符集簡寫手機號規則爲:

  1[3-8]\d\d\d\d\d\d\d\d\d

  

問題:  

  手機號規則中\d寫了9遍,車牌號規則中[0-9A-Z]也寫了五遍,也很不方便。

緣由:

  一個字符集(\d[0-9])只能匹配一位字符,要匹配9位字符,就必須重複寫9遍。

  程序用規則匹配字符串,就像彩票兌獎同樣,是逐字逐個規則匹配。

  不但內容要符合規則,位數首先要一致。

  [\u4e00-\u9fa5][A-Z]·[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]

解決:

  使用數量詞。

(4).數量詞

什麼是:

  數量詞,是專門規定一個字符集出現次數的規則

什麼時候:

  從此,只要一個字符集在規則中可能連續反覆出現屢次,就要用數量詞以簡寫方式定義出現次數。

如何:

  數量詞緊跟在其修飾的字符集以後,默認修飾相鄰的前一個字符集

例如:

  利用數量詞進一步簡寫手機號規則中,可進一步簡寫爲:

     1[3-8]\d{9}     \d{9} 至關於 \d*9次

     

使用數量詞:

利用數量詞進一步簡寫車牌號規則,可進一步簡寫爲:

   [\u4e00-\u9fa5][A-Z]·[0-9A-Z]{5}

   

問題:

  接收短信驗證碼時,網站驗證碼有時4位,有時6位,並不肯定,怎麼辦?

其實,數量詞包括兩大類:

1). 有明確數量邊界的數量詞

字符集{n}      表示字符集必須重複n次,不能多也不能少

例如:

  \d{4,6}  表示4位數字

  

字符集{n,m}   表示字符集至少重複n次,最多重複m次,

例如:  

  \d{4,6}   表示4到6位數字

  

      字符集{n,}     表示字符集匹配的內容至少重複n次,多了不限

  例如:

    \d{6,}     表示6位以上數字

    

2). 沒有明確數量邊界的數量詞

    表示無關緊要,多了不限

    \s*

    

+  表示至少一次,多了不限

  \s+ 

  

?  表示無關緊要,最多一次

  \s?

  

在RegExp Buddy中

—匹配手機短信中的驗證碼:連續的4~6位數字

答案: \d{4,6}

—匹配字符串中的一組連續空字符

答案: \s+

(5).選擇和分組

問題:

  屏蔽敏感詞時,輸入者把字換成拼音就查不出來了

錯誤的作法:

  直接將拼音放入[]中做爲字符集中的備選

  好比:

    [cao]

    

但願:

  草 或 cao

  

緣由:

  字符集只認識單個字,不認識一組拼音

  

正確作法:

  1).選擇

什麼是:

  選擇,是指在多個子規則中選其一匹配

什麼時候:

  從此,只要在多個子規則中選其一匹配時,就用選擇

如何:     

  子規則1   |   子規則2  

讀做:  

  知足規則1    知足規則2

例如:

  草 | cao

問題:

  若是規則寫成「我草|cao」 呢?

但願是:

  我草 cao

  

實際倒是:

  我草 | cao

  

緣由:

由於「|」選擇符只分左右,不考慮單個字符  

解決:

使用分組。

2).分組

什麼是:

  分組,將多個子規則視爲一組,再和分組外的規則匹配

什麼時候:

  只要但願將多個子規則視爲一個總體,再和其它規則匹配時,就用分組

如何:

  其它規則(多個子規則)

例如:

  —匹配一個「草」 字或「cao」這個拼音

  答案: |cao

  

  —匹配「我草」或「我cao

答案: (|cao)

使用選擇和分組:

問題1:

  同時驗證敏感字同音字或拼音,我草、我艹、我cao、我槽

答案:我 ([草艹槽]|cao)

問題2:

  「我」 字也多是「臥」或「wo

  答案:([我臥]|wo)([草艹槽]|cao)

  

問題3:

  可能在中間加不肯定個數的空字符:

答案:([我臥]|wo)\s*([草艹槽]|cao)

在RegExp Buddy中定義規則

—匹配「我草」

  

—匹配 「臥    槽」

  

—匹配wocao」,「我  草」等敏感詞

  

—定義完整手機號規則:

          分析:

+86或0086:(\+86|0086)

至少一個空字符 : \s+

以前全部,總體無關緊要,最多一次: ()?

1

3~9

任選其一 9位數字

  答案: ((\+86|0086)\s+)?1[3-8]\d{9}

  

—定義完整身份證號規則:

分析:

    15位數字: \d{15}    (一代身份證)

    2位數字:  \d\d

    最後一位: 1位數字或Ⅹ:   [0-9Ⅹ]

    最後三位 無關緊要,最多一次 (最後三位)?

答案:\d{15}(\d\d[0-9x])?

    

(6).指定匹配位置

一個字符串中三個位置比較特殊:

—1. 字符串開頭

—2. 字符串結尾

—3. 英文句子中的每一個單詞中間的空白位置

  

若是隻但願匹配特殊位置上的關鍵詞時,就可用特殊符號表示特殊位置。

包括:

—1. ^ 表示字符串開頭

—2. $ 表示字符串結尾

—3. \b 表示單詞邊界,可匹配:空格,標點符號,字符串開頭和結尾等可將一個單詞與其它單詞分割開的符號。

  

例如:

  匹配一組連續的空字符

—1. 匹配任意一組連續的空字符

  

—2. 僅匹配開頭的空字

  

—3. 僅匹配結尾的空字符

  

—4. 同時匹配開頭和結尾的空字符:

  錯誤的作法:

     ^\s+$,表示從開頭到結尾之間只能是空字符!

    

      正確作法:

        |」選擇符,將整個規則強行一分爲2

        

再好比:

  找到每一個單詞首字母

    —前邊緊挨着單詞邊界的字母

      

附圖片(不與博客內容匹配,僅參考):

  

  

  

  

  

  

英文單詞整理Regular  Expression 正則表達式Regular            規則Expression       表達式 作一件事的一條程序的語句\d    digit         (從 0 到 9 的任何一個)數字,數位\s    space       (可利用的)空地,空間;空格\w   word         單詞;詞;字;\b    boundary   邊界

相關文章
相關標籤/搜索