javascript正規表示式

美麗又漂亮的前端發表於2020-11-09

JavaScript有兩種方式建立正規表示式

> var regexConst = new RegExp('abc'); //建構函式方式
> var regexLiteral = /abc/; //字面量方式

有一點要注意,字面量宣告是在//裡面宣告,而建構函式宣告傳進去的引數是字串,所有遇到一些\n這樣轉義字元,需要雙重轉義,變成\\n,下面列出了一些例子:

image.png

正規表示式相關函式

test():RegExp物件提供的方法。檢索字串中指定的值。匹配成功返回 true 否則返回 false

var regex = /hello/;
var str = 'hello world';
var result = regex.test(str);
console.log(result);

exec():RegExp物件提供的方法。檢索字串中指定的值。匹配成功返回一個陣列,匹配失敗返回null

var reg=/hello/;
console.log(reg.exec('hellojs'));//['hello']
console.log(reg.exec('javascript'));//null

match():字元物件提供的方法。在字串內檢索指定的值,匹配成功返回存放匹配結果的陣列,否則返回null。這裡需要注意的一點事,如果沒有設定全域性匹配g,返回的陣列只存第一個成功匹配的值。

var reg1=/javascript/i;
var reg2=/javascript/ig;
console.log('hello Javascript Javascript Javascript'.match(reg1));
//['Javascript']
console.log('hello Javascript Javascript Javascript'.match(reg2));
//['Javascript','Javascript','Javascript']

search():字元物件提供的方法。在字串內檢索指定的值,匹配成功返回第一個匹配成功的字串片段開始的位置,否則返回-1。

var reg=/javascript/i;
console.log('hello Javascript Javascript Javascript'.search(reg));//6

replace():字元物件提供的方法。替換與正規表示式匹配的子串,並返回替換後的字串。在不設定全域性匹配g的時候,只替換第一個匹配成功的字串片段。

var reg1=/javascript/i;
var reg2=/javascript/ig;
console.log('hello Javascript Javascript Javascript'.replace(reg1,'js'));
//hello js Javascript Javascript
console.log('hello Javascript Javascript Javascript'.replace(reg2,'js'));
//hello js js js

split():字元物件提供的方法。把一個字串分割成字串陣列。

var reg=/1[2,3]8/;
console.log('hello128Javascript138Javascript178Javascript'.split(reg));
//['hello','Javascript','Javascript178Javascript']

最簡單的正規表示式

var regex = /hello/;
console.log(regex.test('hello world'));
// true

修飾符

有三種:i, g, m,可以同時出現,沒有順序(即 gi 與 ig 一樣),請參考下方說明
修飾符說明:
i 忽略大小寫匹配
g 全域性匹配,即是匹配一個後繼續匹配,直到結束
m 多行匹配,即是遇到換行後不停止匹配,直到結束

例子:

'abc'.match(/abc/); //['abc']
'abcd'.match(/abc/); //['abc'] 沒有/g只返回第一個成功匹配的值
'abcdabc'.match(/abc/g); //['abc', 'abc'] 
'abCabc'.match(/abc/gi); //['abc', 'abc']
'abC\nabc'.match(/abc/gim); //['abc', 'abc']  \n是換行符

方括號 [] 用法

image.png

部分元字元說明

image.png

例子:

'aBcd efg'.match(/[a-z]+/); // ["a"] 
'aBcd efg'.match(/[a-z]+/i); // ["aBcd"] 
'aBcd efg'.match(/[a-z]+/g); // ["a", "cd", "efg"] 
'aBcd efg'.match(/[a-z]+/gi); // ["aBcd", "efg"] 
'aB\ncd\n efg'.match(/^[a-z]+/m); // ["a"] 
'aB\ncd\n efg'.match(/^[a-z]+/g); // ["a"] 
'aB\ncd\n efg'.match(/^[a-z]+/gm); // ["a", "cd"] // 注意不是 ["a", "cd", "efg"]
'adobe 2016'.match(/\d+|[a-z]+$/g); // ["2016"]
'adobe'.match(/\d+|[a-z]+$/g); // ["adobe"]
'adobe2016ps'.match(/\d+|^[a-z]+/g); // ["adobe", "2016"]

總結^的用法:

  • 在 [] 內開始位置:

    'adobe 2016'.match(/^[a-zA-Z]+/); // ["adobe"]
  • 在正則雙斜線開始位置:

    'adobe'.match(/[^abc]/g); // ["d", "o", "e"]
  • 帶有|字元中使用:

    'adobe2016ps'.match(/\d+|^[a-z]+/g); // ["adobe", "2016"]
  • 在其他位置:

    '12a^eee'.match(/a\^/g); // ['a^']

表示所有字母,不區分大小寫:

'adobe-PS'.match(/[a-z]/gi); // ["a", "d", "o", "b", "e", "P", "S"]
'adobe-PS'.match(/[a-zA-Z]/g); // ["a", "d", "o", "b", "e", "P", "S"]

一些隱性概念

正則中大部分都是匹配單個字元:

'adobe 2016'.match(/[a-z]/g) //["a", "d", "o", "b", "e"]

少部分匹配結果是字串而不是單個字元:

'aBcd efg'.match(/[a-z]+/i); // ["aBcd"]

兩個規則緊挨著,說明匹配的時候,這兩個字元是相連的:

'adobe-2016'.match(/[a-g\-]/g); // ["a", "d", "b", "e", "-"] 
// 對連字元 - 本身進行匹配,需要用反斜線轉義
'addo2-ado12os3'.match(/o\d/g); //['o2', 'o1']

消耗字元的概念:如下這個例子,不是[“adobw12px”,”ps15test”],因為ps這兩個字元已經消耗掉了

'adobe12ps15test'.match(/[a-z]+\d+[a-z]+/); // ["adobe12ps"]

匹配模式預設是貪婪的,儘可能多的匹配所搜尋的字串:

'aBcd efg'.match(/[a-z]+/gi);// ["aBcd", "efg"]
'a3 aaa12bb aaaaaaa34'.match(/a{2,4}\d+/g); 
// ["aaa12", "aaaa34"]  a{2,4}:2到4個a,大括號的用法後面會細講

特殊含義字元

  • .匹配任意單個字元,除換行和結束符

      '1+0.2*2=1.4'.match(/.{2}/g);
      // ["1+", "0.", "2*", "2=", "1."]
  • \w 匹配任意單詞字元(數字、字母、下劃線),等價於[A-Za-z0-9_]

      'ad34~!@$ps'.match(/\w/g);
      // ["a", "d", "3", "4", "p", "s"]
    
  • \W 匹配任意單詞字元,與\w相反,等價於1

      'ad34~!@$ps'.match(/\W/g);
      // ["~", "!", "@", "$"]
  • \d 匹配數字,等價於 [0-9]

    'ps6'.match(/\d/g);
     // ["6"]
  • \D 匹配非數字,等價於 [0-9]

      'ps6'.match(/\D/g);
      // ["p", "s"]
  • \s 匹配空白字元,主要有(\n、\f、\r、\t、\v),注意'a\sb'中的\s依然是字元s,所以'a\sb'.match(/\s/g)返回 null

      'adobe ps'.match(/\s/g);
      // [" "]
  • \S 匹配非空白字元,與\s相反

      'adobe ps'.match(/\S/g);
      // ["a", "d", "o", "b", "e", "p", "s"]
  • \b 匹配單詞邊界,注意連續的數字、字母或下劃線組成的字串會認為一個單詞

      'adobe(2016) ps6.4'.match(/\b(\w+)/g);
      // ["adobe", "2016", "ps6", "4"]
  • \B 匹配非單詞邊界,仔細體會下面的示例與\b的結果

      'adobe(2016) ps6.4'.match(/\B(\w+)/g);
      // ["dobe", "016", "s6"]
  • \0 匹配NUL字元

    '\0'.match(/\0/);
     // ["NUL"]
  • \n 匹配換行符(編碼:10,newline)

      'adobe\nps'.match(/\n/).index;
      // 5
  • \f 匹配換頁符

      'adobe\fps'.match(/\f/).index;
      // 5
  • \r 匹配回車符(編碼:13,return)

      'adobe\rps'.match(/\r/).index;
      // 5
  • \t 匹配製表符,鍵盤tab對應的字元

      'adobe\tps'.match(/\t/).index;
      // 5
  • \v 匹配垂直製表符

      'adobe\vps'.match(/\v/).index;
      // 5
  • \xxx 匹配以八進位制數xxx規定的字元

      'a'.charCodeAt(0).toString(8);
      // "141"
      'adobe ps'.match(/\141/g);
      // ["a"]
  • \xdd 匹配以十六進位制數dd規定的字元

      'a'.charCodeAt(0).toString(16);
      // "61"
      'adobe ps'.match(/\x61/g);
      // ["a"]
  • \uxxxx 匹配以十六進位制數xxxx規定的 Unicode字元,注意位數不夠需要補0

      'a'.charCodeAt(0).toString(16);
      // "61"
      'adobe ps'.match(/\u0061/g);
      // ["a"]

    量詞說明

  • n+ 匹配包含至少一個n的字串

      'adobe paas'.match(/a+\w+/g);
      // ["adobe", "aas"]
  • n* 匹配包含零個或多個n的字串

      'ab3 aa12bb'.match(/a*\d+/g);
      // ["3", "aa12"]
  • n? 匹配包含零個或一個n的字串

      'ab3 aa12bb'.match(/a?\d+/g);
      // ["3", "a12"]
  • n{x} 匹配包含連續x個n的字串

      'ab3 aa12bb aaa34'.match(/a{2}\d+/g);
      // ["aa12", "aa34"]
  • n{x,y} 匹配包含至少連續x個且最多連續y個n的字串

      'a3 aaa12bb aaaaaaa34'.match(/a{2,4}\d+/g);
      // ["aaa12", "aaaa34"]
  • n{x,} 匹配包含至少連續x個n的字串

      'a3 aaa12bbaa4'.match(/a{2,}\d+/g);
      // ["aaa12", "aa4"]

由上可知,以下 表示式1 與 表示式2 等價
image.png

小括號 () 用法

  • 分組的用法,即捕獲的用法:
'https://baidu.com'.match(/https:\/{2}\w+\.com$/g); //['https://baidu.com']
'https://baidu.com'.match(/(https):\/{2}\w+\.(com)$/g);//['https://baidu.com']

image.png

捕獲的意思:能夠通過RegExp.$1這種方式捕獲到

  • 和|一起使用
'https://baidu.com'.match(/(http|https):\/{2}\w+\.(com|cn)$/g);
//['https://baidu.com']
  • 不捕獲的用法,無法通過RegExp.$1這種方式捕獲到

    'https://baidu.com'.match(/(?:http|https):\/{2}\w+\.(com|cn)$/g);
    //['https://baidu.com']

    image.png

反斜槓的用法

斜槓:/(大寫八字的左邊)需要轉義,因為正則字面量寫法就是兩個斜槓
反斜槓:\(大寫八字的右邊)不需要轉義

//轉義特殊字元的作用:
'11+2=13'.match(/\d+\+/g); 
//["11+"]
'(11+2)*2=26'.match(/\(\d+\+\d+\)/g); // ["(11+2)"]
//斜槓需要轉義,反斜槓不需要轉義:
'path C:\Windows\System32'.match(/([a-zA-Z]:\\\w+)/g); 
// null 
'path C:\\Windows\\System32'.match(/([a-zA-Z]:\\\w+)/g); 
// ["C:\\Windows"]
'https://baidu.com'.match(/(http|https):\/\/\w+\.(com|cn)$/g);
//['https://baidu.com']

問號(?)的用法

image.png

  • (?:n ) 表示非捕獲組

      // 不使用括號時
      'adobe12ps15test'.match(/[a-z]+\d+[a-z]+/);
      // ["adobe12ps"]
      // 使用括號分組
      'adobe12ps15test'.match(/[a-z]+(\d+)([a-z]+)/);
      // ["adobe12ps", "12", "ps"]
      'adobe12ps15test'.match(/[a-z]+(?:\d+)([a-z]+)/);
      // ["adobe12ps", "ps"]
      // 看起來上面語句不用(?:)也可以得到相同結果,即:
      'adobe12ps15test'.match(/[a-z]+\d+([a-z]+)/);
      // ["adobe12ps", "ps"]
    
      // 注意,但需求希望匹配字母之間的規則複雜時,如希望匹配字母,且字母之間可以為1或3時,但不需要1和3
      'adobe11ps15test'.match(/[a-z]+(1|3)+([a-z]+)/);
      // ["adobe11ps", "1", "ps"]
      // 返回中不希望包含數字怎麼辦,可以使用非捕獲
      'adobe11ps15test'.match(/[a-z]+(?:1|3)+([a-z]+)/);
      // ["adobe11ps", "ps"]
  • (?=n ) 匹配任何其後緊跟字元n的字串,但返回中不包含n

      'adobe12ps15test'.match(/[a-z]+(?=\d)/g);
      // ["adobe", "ps"]
  • (?!n ) 匹配任何其後沒有緊跟字元n的字串,返回中不包含n

      'adobe12ps15test'.match(/[a-z]+(?!\d)/g);
      // ["adob", "p", "test"]
  • (?<=n ) 匹配任何其前緊跟字元n的字串,返回中不包含n

      'adobe12ps15test'.match(/(?<=\d)[a-z]+/g);
      // ["ps", "test"]
  • (?<!n ) 匹配任何其前緊跟字元n的字串,返回中不包含n

      'adobe12ps15test'.match(/(?<!\d)[a-z]+/g);
      // ["adobe", "s", "est"]

運算子優先順序

image.png

常見正規表示式

1.由數字、26個英文字母或者下劃線組成的字串:
    ^[0-9a-zA-Z_]{1,}$ 
2.非負整數(正整數 + 0 ):
    ^/d+$
3. 正整數:
    ^[0-9]*[1-9][0-9]*$
4.非正整數(負整數 + 0):
    ^((-/d+)|(0+))$
5. 負整數 :
    ^-[0-9]*[1-9][0-9]*$
6.整數:    
    ^-?/d+$
7.非負浮點數(正浮點數 + 0):
    ^/d+(/./d+)?$
8.正浮點數 :
    ^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$
9. 非正浮點數(負浮點數 + 0):
    ^((-/d+(/./d+)?)|(0+(/.0+)?))$
10.負浮點數 :
    ^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$
11. 浮點數 :
    ^(-?/d+)(/./d+)?$
12.由26個英文字母組成的字串 :    
    ^[A-Za-z]+$
13. 由26個英文字母的大寫組成的字串 :
    ^[A-Z]+$
14.由26個英文字母的小寫組成的字串 :
    ^[a-z]+$
15. 由數字和26個英文字母組成的字串 :
    ^[A-Za-z0-9]+$
16.由數字、26個英文字母或者下劃線組成的字串 :    
    ^/w+$
17.email地址 :
    ^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$
18.url:    
    ^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$
19. 年-月-日:
    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/
20.月/日/年:
    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/
21.Emil:
    ^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$
22. 電話號碼:
    (d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?
23.IP地址:
    ^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$
24. 匹配中文字元的正規表示式:
    [/u4e00-/u9fa5]
25.匹配雙位元組字元(包括漢字在內):
    [^/x00-/xff]
26. 匹配空行的正規表示式:
    /n[/s| ]*/r
27.匹配HTML標記的正規表示式:
    /<(.*)>.*<///1>|<(.*) //>/
28.匹配首尾空格的正規表示式:
    (^/s*)|(/s*$)
29.匹配Email地址的正規表示式:
    /w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
30. 匹配網址URL的正規表示式:
    ^[a-zA-z]+://(//w+(-//w+)*)(//.(//w+(-//w+)*))*(//?//S*)?$
31. 匹配帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):
    ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
32. 匹配國內電話號碼:
    (/d{3}-|/d{4}-)?(/d{8}|/d{7})?
33.匹配騰訊QQ號:
    ^[1-9]*[1-9][0-9]*$
34. 只能輸入數字:
    ^[0-9]*$
35.只能輸入n位的數字:
    ^/d{n}$
36.只能輸入至少n位的數字:
    ^/d{n,}$
37.只能輸入m~n位的數字:
    ^/d{m,n}$
38.只能輸入零和非零開頭的數字:
    ^(0|[1-9][0-9]*)$
39.只能輸入有兩位小數的正實數:
    ^[0-9]+(.[0-9]{2})?$
40. 只能輸入有1~3位小數的正實數:
    ^[0-9]+(.[0-9]{1,3})?$
41.只能輸入非零的正整數:
    ^/+?[1-9][0-9]*$
42. 只能輸入非零的負整數:
    ^/-[1-9][0-9]*$
43.只能輸入長度為3的字元:
    ^.{3}$
44. 只能輸入由26個英文字母組成的字串:
    ^[A-Za-z]+$
45.只能輸入由26個大寫英文字母組成的字串:
    ^[A-Z]+$
46. 只能輸入由26個小寫英文字母組成的字串:
    ^[a-z]+$
47.只能輸入由數字和26個英文字母組成的字串:
    ^[A-Za-z0-9]+$
48. 只能輸入由數字和26個英文字母或者下劃線組成的字串:
    ^/w+$
49.驗證使用者密碼(正確格式為: 以字母開頭,長度在5~17 之間,只能包含字元、數字和下劃線)
    ^[a-zA-Z]/w{5,17}$
50.驗證是否包含有 ^%&',;=?$/"等字元:
    [^%&',;=?$/x22]+
51.只能輸入漢字:
    ^[/u4e00-/u9fa5]{0,}$
52、只含有漢字、數字、字母、下劃線不能以下劃線開頭和結尾
    ^(?!_)(?!.*?_$)[a-zA-Z0-9_/u4e00-/u9fa5]+$
53、只含有漢字、數字、字母、下劃線,下劃線位置不限
    ^[a-zA-Z0-9_/u4e00-/u9fa5]+$
54、2~4個漢字
    @"^[/u4E00-/u9FA5]{2,4}$

參考學習資料:
https://cloud.tencent.com/dev...
https://www.runoob.com/regexp...


  1. A-Za-z0-9_

相關文章