正則表達式基礎入門

概述

正則表達式是一種被用於匹配字符串的字符匹配模式。多用於表單驗證。正則表達式:regular expression,簡稱RegExp。javascript

建立正則表達式最簡單的方式使用正則字面量。

字面量:用兩個/作界定符。通常會將字面量賦值給一個變量。java

var pattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;git

正則表達式可使用一些字符串方法或正則方法進行操做:正則表達式

字符串的方法:express

  • split()根據匹配字符串切割父字符串,返回子串組成的數組。
  • match()使用正則表達式與字符串相比較,返回一個包含匹配結果的數組。
  • search()對正則表達式或指定字符串進行搜索,返回第一個出現的匹配項的下標。
  • replace()用正則表達式和字符串直接比較,而後用新的子串來替換被匹配的子串,返回新的匹配以後的字符串。

正則表達式方法:數組

  • exec()在目標字符串中執行一次正則匹配操做,返回的是第一次匹配的子串的數組。
  • test()測試當前正則是否能匹配目標字符串,返回true或false。

不一樣的數據類型又本身的方法和屬性,使用時必須調用正確,下面分別介紹幾種方法的使用。

字符串方法

  • plit()根據匹配字符串切割原字符串。split方法傳遞的參數是分隔符,能夠是str或者reg,找到分隔符以後就從str中刪除,返回子串數組。

若是沒有找到分隔符,那麼返回的數組包含的是一整個str組成元素的數組。若是分隔符爲空字符串「」,返回的是字符串每一個字符組成元素的數組。 返回值:由切割後的子字符串組成數組。能夠用來將用戶輸入的不規範的字符串轉爲正確的Array。bash

例:根據空格切割字符串:'aa bbb c dd eeeeee'函數

'aa bbb c dd eeeeee'.split(/\s+/);   //["aa","bbb","c","dd","eeeeee"]
複製代碼

\s:表示空白字符;測試

+:表示前面的一個符號表明的字符能夠出現一次或者屢次ui

  • earch()對正則表達式或指定字符串進行搜索,傳入的參數是字符串或者reg,返回第一個出現的匹配項的下標(相似indexOf)。

返回值:子串或正則匹配結果在父字符串中的第一次出現的位置的下標。search搜索只找到第一次搜索到的位置下標,因此全局標誌也就不起做用了。若是匹配的子串在父字符串中沒有對應的字符,返回結果就是-1.(能夠利用search匹配字符串有無在表格中進行關鍵字搜索,條件判斷是看是否等於-1)

function withSearch(str){
            var newStr = "";
            for(var i =0; i<str.length; i++){
                if(newStr.search(str[i]) == -1){
                    newStr += str[i];
                }
            }
            return newStr;
        }
        console.log(withSearch('abcdde'));     //abcde
複製代碼
  • match()使用正則表達式與字符串相比較,接受參數只有一個要麼是正則表達式,要麼是reg對象,返回一個包含匹配結果的數組。本質上和調用正則的exec方法相同。

返回值:是由匹配結果組成的數組。和split同樣返回的是數組,可是match返回的是第一個匹配的子串,不過能夠應用全局標誌g,搜索所有。

在 'abbcccbbbbbddbbbdabbb' 中查詢重複 'b' 字符串

'abbcccbbbbbddbbbdabbb'.match(/b+/);     //['bb']
複製代碼
  • replace()用正則表達式和字符串直接比較,而後用新的子串來替換被匹配的子串。 參數:傳遞兩個參數,第一個是正則或匹配的字符串,第二個是要替換的新的內容或者函數。

返回值:是一個新的字符串,原始字符串不發生變化。若是第一個參數是字符串,那麼只會替換第一個子字符串;想要替換全部子串,只有一個辦法就是傳入reg,同時指定g標誌。

例:過濾字符串中空格:'aa b c d e f ' => "aabcdef" 使用全局界定符g進行全局匹配和替換。

str.replace(/\s+/g, ‘’);      //用空字符串替換匹配的空白
複製代碼

正則方法

  • exec()在字符串中尋找匹配字符串,並返回一個包含匹配結果的數組。返回的數組很特別的帶了兩個屬性,能夠經過調用index屬性和input屬性查看匹配的子串在字符串中的位置,而input表示應用reg的字符串。

參數:要查找的字符串。

exec方法即便在模式中設置了全局標誌g,每次也只會返回一個匹配項。在不設置g時,同一個str上屢次調用exec()都始終返回第一個匹配項;而設置了g,每次調用exec()都會在字符串中繼續查找新的匹配項,知道搜索到字符串末尾爲止。lastIndex在全局模式下回隨着調用而改變++。《高級程序設計》

  • test() 檢測字符串是否匹配正則表達式,傳入的參數是字符串,若是字符串中有正則匹配的就返true。 正則表達式中若是沒有限制開頭也沒有限制結尾,只要字符串中包含正則匹配的部分,就會返回一個true的值,不然返回false。

test方法常常用在if判斷語句中做爲條件來使用。

判斷'aaddccddabcddeeddfff'是否包含'abc'字符串

/abc/.test('aaddccddabcddeeddfff');  //true
複製代碼

正則表達式的術語和操做符

正則表達式的組成:由一些普通字符和一些特殊字符(又叫元字符--metacharacters)組成。普通字符包括大小寫的字母和數字,而元字符則具備特殊的含義。 特殊字符: javascript中經常使用正則的特殊字符有

( ) [ ] { } \ ^ $ | ? * + . 若想匹配這類字符必須用轉移符號 \ 如:\(,\^,\\

  • 精確匹配

正則表達式中是一些普通字符組成,在進行字符串匹配時,須要進行精確匹配,好比/good/,匹配時,字符串中必須包含g,o,o,d四個字符,並且順序不能發生變化,中間也不容許出現其餘字符,也就是說必須包含」good」字符串。

  • 預約義特殊字符

預約義特殊字符:

\t /\t/製表符,縮進 eg: console.log(/\t/.test('’)),表示匹配一個縮進或製表符

\n /\n/回車符 eg: console.log(/\n/.test(aaabbb)); ,表示匹配一個回車換行

問題:""不能包裹一個包含回車換行的字符串。

解決方法:將引號換成數字1前面的``引號,就能夠包括回車。 \f /\f/換頁符 \b /\b/空格,表示匹配的是一個空格,\b能夠搭配字符匹配做爲邊界的查找標識符,在邊界處詳細講。

  • 字符集
    字符集:表示一類中任何一個字符均可以匹配,核心是[]類對應的是一個字符。 字符集寫法:[一類字符]

簡單類:正則的多個字符對應一個字符,咱們能夠用[]把它們括起來,讓[]這個總體對應一個字符 o[abc]z →oaz,obz,ocz

範圍類:有時匹配的東西過多,並且類型又相同,所有輸入太麻煩,咱們能夠在中間加了個橫線。 [a-z]、[0-9]、[A-Z]

組合類:容許用中括號匹配不一樣類型的單個字符[a-zA-Z0-9] [a-zA-Z_$][a-zA-Z0-9_$] 變量名的命名規則 [0-9a-z]:表示能夠匹配小寫字母或者數字。

負向類:[]內部最前面加個元字符^進行取反,表示匹配不能爲括號裏面的字符。 [^a]:表示只要不是a都能匹配成功。

  • 修飾符

g 全局修飾符,再查找時不會找到第一次結果後就結束,而是在找到全局範圍內全部結果後再結束。 global:全球的、全局的。 書寫位置:在正則符號的後面//g.

i 修飾符用於執行對大小寫不敏感的匹配。case-insensitive 書寫位置:在正則符號的後面//i

m表示多行模式,忽略換行。

  • 邊界

^開頭注意不能緊跟於左中括號的後面 書寫位置:寫在//正則符號內部的開始位置,表示後面的字符必須匹配成功,並且須要做爲字符串的開頭。

$結尾 書寫位置:寫在//正則符號內部的結束位置,表示$前面的字符必須匹配成功,並且須要做爲字符串的結束。

綜合使用^和 $,分別界定字符串的開頭和結尾,表示中間部分的字符必須匹配成功,並且全部字符必須位於開頭,也必須位於結尾。也就是說中間的部分就是字符串的所有。

\b單詞邊界,用於查找位於單詞的開頭或結尾的匹配。區間比^$要小,只做用在單詞。 \b會搭配其餘字符進行匹配,其餘字符必須先匹配成功,若是\ba,要先匹配一個a字符,還要求a位於一個單詞的開始位置,若是c\b,表示要匹配一個c字符,還要求c必須位於一個單詞的結尾。

若是先後都有\b,表示內部匹配的結果必須是一個單獨的完整的單詞。

\B非單詞邊界,用於查找不處在單詞的開頭或結尾的匹配。 \B也要搭配其餘符號進行匹配,表示前面後後面的匹配的字符,除了要匹配成功以外,還不能位於一個單詞的開頭或結尾。

  • 預約義類

本質就是將最經常使用的一些特殊類的字符集進行一個簡化書寫。

[^\n\r]除了換行和回車以外的任意字符 匹配:除了回車和換行以外其餘全部字符,好比數字、字母、漢字、特殊符號、空格、縮進等。

\d[0-9]數字字符(digital) 匹配:匹配一個任意的數字字符。

\D[^0-9]非數字字符 匹配:非數字字符,只要不是數字都能匹配成功

\s[ \t\n\x0B\f\r]空白字符(space) 匹配:能夠匹配全部的空白,包括縮進、回車、換行、空格、換頁。

\S[^ \t\n\x0B\f\r]非空白字符 匹配:表示全部非空白的字符,除了空白都能匹配。

\w[a-zA-Z_0-9]單詞字符(全部的字母/數字/下劃線) 匹配:全部的字母(大小寫)、數字、下劃線。

\W[^a-zA-Z_0-9]非單詞字符 匹配:除了數字、字母、下劃線,其餘都能匹配。

  • 量詞

有時會遇到某個正則符號須要連續匹配屢次,能夠利用量詞進行次數描述。 使用{}包裹數字,表示前面的一個字符能夠出現多少次。

{n}硬性量詞對應零次或者n次 表示:n是幾,前面的符號須要連續出現對應的幾回。

{n,m}軟性量詞至少出現n次但不超過m次(中間不能有空格) 表示:前面的字符必須出現至少n次,最多不超過m次。

{n,}軟性量詞至少出現n次(+的升級版) 表示:前面的字符能夠出現n次及以上。

?{0,1}軟性量詞出現零次或一次

*{0,}軟性量詞出現零次或屢次(任意次)

+{1,}軟性量詞出現一次或屢次(至少一次)

量詞只能修飾前面的一個字符,不能直接修飾前面多個字符,想要操做多個要把想操做的字符串用小括號括起來。

  • 或操做符

可使用豎線(|)字符表示或者的關係。 若是沒有任何限制的狀況下,或操做符會將總體正則表達式分紅兩部分。 只要有一種狀況匹配成功都能返回true。

若是咱們想匹配a和c中匹配d或b,須要將d和b的或關係放在小括號內,縮小或操做符的範圍。

  • 分組

雖然量詞的出現,能幫助咱們處理一排密緊密相連的同類型字符。但這是不夠的,咱們用中括號表示範圍內選擇,大括號表示重複次數。若是想獲取重複多個字符,咱們就要用小括號進行分組了。 使用小括號分組後,就能夠對內部字符進行總體的控制。

  • 分組的反向引用

反向引用標識是對正則表達式中的匹配組捕獲的子字符串進行編號,經過「\編號(在表達式中)」,「$編號(在表達式外)」進行引用。從1開始計數。

正則中若是有小括號的分組,會在字符串中找到匹配的子字符串,能夠將子字符串結果拿到正則中進行二次使用,或者正則表達式以外進行二次調用。 正則表達式中有多個小括號的話,按照編號1,2,3……進行編號,從左往右。exec test str的replace均可以使用這種方法

正則中:使用\1,反向使用子串1的結果。

正則外面:使用$1,反向使用子串1的結果。

字符串的replace方法的反向引用。 第一個參數:正則表達式,內部有小括號的話,能夠進行編號,按順序小括號分別對應第一小組,第二小組...。 第二個參數:能夠利用分組匹配結果,進行反向引用。

更經常使用的方式,給replace第二個參數設置爲一個替換函數。

注意:

1.函數的參數位置,第一個必須寫match,後面的參數可使用反向引用的編號$,$2……

2.函數必須有返回值,返回值的結果纔是替換字符串的內容。

應用:找出字符串中最長的重複子串

function demo(str) {
        var arr = str.split(''); //把字符串轉換爲數組
        str = arr.sort().join(''); 

        var value = ‘’;     //用來存放出現最多的substr的中間變量
        var index = 0;     //用來存放最大長度
            
       var re = /(\w)\1+/g; //
           
        str.replace(re, function ($0, $1) {
            //alert($0); 表明每次匹配成功的結果 : aa dd jj kk l sssssssssssssssss
            //alert($1); 表明每次匹配成功的第一個子項,也就是\w: a d j k l s 

        if (index < $0.length) { //若是index保存的值小於$0的長度就進行下面的操做
            index = $0.length; // 這樣index一直保存的就在最大的長度
            value = $0; //value保存的是出現最多的這個字符
        }
    });
        alert('最多的字符:' + value + ',重複的次數:' + index); 
    }
複製代碼
  • 中文字符

匹配中文:[\u4e00-\u9fa5]

經常使用正則表達式

網上的一些經常使用方法

  • 用戶名:4-16位,字母、數字、下劃線、減號. 同時包括的內容能夠經過放到一個類中,+進行屢次選擇。
var pattern = /^[a-zA-Z0-9_-]{4,16}$/;
複製代碼
  • 密碼強度:最少6位,包括1個大寫字母,1個小寫,1個數字,1個特殊符號
var pattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
複製代碼

(?<= )是連在一塊兒的格式,不要把=單獨拿出。與之對應的格式是(?<! )。

(?<=\s*)\d+ 匹配的是 "abc 123abc""abc123abc"中的"123" 匹配的是:前面有"重複0次或多個空格"後面緊跟的是數字的數字部分; 注:匹配的字符串只有\d+,不包括\s*

(?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的後面能匹配表達式exp。 好比\b\w+(?=ing\b),匹配以 ing 結尾的單詞的前面部分(除了 ing 之外的部分),如查找 I'm singing while you're dancing.時,它會匹配 sing 和 danc。 (?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表達式 exp。好比(?<=\bre)\w+\b 會匹配以re開頭的單詞的後半部分(除了 re之外的部分),例如在 查找reading a book時,它匹配ading。 假如你想要給一個很長的數字中每三位間加一個逗號(固然是從右邊加起了), 你能夠這 樣查找須要在前面和裏面添加逗號的部分:((?<=\d)\d{3})*\b,用它對 1234567890 進行查 找時結果是234567890。 下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次 強調,不包括這些空白符)

  • 數字:^[0-9]+$

  • n位的數字:^\d{n}$

  • 至少n位的數字:^\d{n,}$

  • m-n位的數字:^\d{m,n}$

  • 零和非零開頭的數字:^(0|[1-9][0-9]*)$

  • 非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$

  • 帶1-2位小數的正數或負數:^(-)?\d+(.\d{1,2})?$

  • 正數、負數、和小數:^(-|+)?\d+(.\d+)?$

  • 有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$

  • 有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$

  • 非零的正整數:^[1-9]\d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$

  • 非零的負整數:^-[1-9][]0-9"$ 或 ^-[1-9]\d$

  • 非負整數:^\d+$ 或 ^[1-9]\d*|0$

  • 非正整數:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

  • 非負浮點數:^\d+(.\d+)?$ 或 ^[1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$

  • 非正浮點數:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$

  • 正浮點數:^[1-9]\d*.\d*|0.\d*[1-9]\d*$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$

  • 負浮點數:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$

  • 浮點數:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$

  • 漢字:^[\u4e00-\u9fa5]{0,}$

  • 英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

  • 長度爲3-20的全部字符:^.{3,20}$

  • 由26個英文字母組成的字符串:^[A-Za-z]+$

  • 由26個大寫英文字母組成的字符串:^[A-Z]+$

  • 由26個小寫英文字母組成的字符串:^[a-z]+$

  • 由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$

  • 由數字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$

  • 中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$

  • 中文、英文、數字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

  • 能夠輸入含有^%&',;=?$"等字符:[^%&',;=?$\x22]+

  • 禁止輸入含有~的字符:[^~\x22]+

  • Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$

  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

  • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$

  • 手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

  • 電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$

  • 國內電話號碼(0511-440522二、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

  • 身份證號(15位、18位數字):^\d{15}|\d{18}$

  • 短身份證號碼(數字、字母x結尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

  • 賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

  • 密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$

  • 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$

  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}

  • 一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$

  • 一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

  • 1到3個數字,後面跟着任意個 逗號+3個數字,逗號成爲可選,而不是必須:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

  • 備註:這就是最終結果了,別忘了"+"能夠用"*"替代若是你以爲空字符串也能夠接受的話(奇怪,爲何?)最後,別忘了在用函數時去掉去掉那個反斜槓,通常的錯誤都在這裏

  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$

  • 雙字節字符:[^\x00-\xff] (包括漢字在內,能夠用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1))

  • 空白行的正則表達式:\n\s*\r (能夠用來刪除空白行)

  • HTML標記的正則表達式:<(\S*?)[^>]>.?</\1>|<.*? />

  • 首尾空白字符的正則表達式:^\s*|\s*$或(^\s*)|(\s*$) (能夠用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),很是有用的表達式)

  • 騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)

  • 中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼爲6位數字)

  • IP地址:\d+.\d+.\d+.\d+ (提取IP地址時有用)

  • IP地址:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

相關文章
相關標籤/搜索