1. 程式人生 > >JavaScript正則常用知識總結

JavaScript正則常用知識總結

ignorecas nbsp enc 屬性。 docs 插入 pro 兩種 .org

一、JavaScript正則相關方法

str.match(regexp)與regexp.exec(str)功能類似。

str.search(regexp)與regexp.test(str)功能類似。

1. String.prototype.match()

檢索匹配項,並返回匹配的第一個完整子串及其下捕獲組捕獲結果構成的數組(無g),或返回匹配的所有的完整子串(有g)

語法

str.match(regexp)
param:
  • regexp: 一個正則表達式對象。如果傳入一個非正則表達式對象,則會隱式地使用 new RegExp(obj) 將其轉換為一個 RegExp 。
return:
  • 如果正則表達式不包含g標誌:會返回一個數組,數組的第一項是進行匹配完整的字符串,之後的項是用圓括號捕獲的結果;數組還會包含一個 index屬性

    ,其值為匹配結果中的完整字符串在原字符串中的索引;數組還會包含一個 input屬性, 其值為原字符串。此時返回的結果和 regexp.exec()返回的結果是完全相同的。

  • 如果正則表達式包含g標誌:會返回一個數組,包含所有匹配的完整子字符串,但不包含匹配的捕獲組捕獲結果;也沒有index屬性和Input屬性。

  • 如果提供了正則表達式,但是沒有匹配到(無論是否帶g): 返回null

  • 如果未提供任何參數,直接使用 match(): 返回一個包含空字符串的 Array :[""],同時該Array還包含index屬性為0,input屬性為原字符串 。

示例1: 正則表達式不帶g, 帶有捕獲組, 且只有一個完整匹配

var str = ‘For more information, see Chapter 3.4.5.1‘;
var reg = /see (chapter \d+(\.\d)*)/i;

var result = str.match(reg);

/* result:
[ 
  "see Chapter 3.4.5.1", 
  "Chapter 3.4.5.1", 
  ".1", 
  index: 22, 
  input: "For more information, see Chapter 3.4.5.1", groups: undefined
]
*/

// ‘see Chapter 3.4.5.1‘ 是整個匹配。
// ‘Chapter 3.4.5.1‘ 被‘(chapter \d+(\.\d)*)‘捕獲。
// ‘.1‘ 是被‘(\.\d)‘捕獲的最後一個值。
// ‘index‘ 屬性(22) 是整個匹配從零開始的索引。
// ‘input‘ 屬性是被解析的原始字符串。

示例2:正則表達式帶g, 帶有捕獲組, 且只有一個完整匹配

var str = ‘For more information, see Chapter 3.4.5.1‘;
var reg = /see (chapter \d+(\.\d)*)/ig;

var result = str.match(reg);

/* result:

[
  "see Chapter 3.4.5.1"
]
*/

示例3:正則表達式帶g, 不帶捕獲組,有多個完整匹配

var str = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz‘;
var regexp = /[A-E]/gi;
var result = str.match(regexp);

/* result:
["A", "B", "C", "D", "E", "a", "b", "c", "d", "e"]
*/

示例4:正則表達式帶g, 帶有捕獲組,有多個完整匹配

var str = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz‘;
var regexp = /A(BCD)*/gi;
var result = str.match(regexp);

/* result:
["ABCD", "abcd"]
*/

示例5: 不傳參數

var str = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz‘;

var result = str.match();

/* result:
[
  "", 
  index: 0, 
  input: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 
  groups: undefined
  ]
*/

2. RegExp.prototype.exec()

在一個指定字符串中執行一個搜索匹配。返回一個結果數組或 null。並會更新正則表達式對象的屬性。

語法

regExp.exec(str)
param
  • str:要匹配正則表達式的字符串
return
  • 如果匹配成功:會返回一個數組,數組的第一項是進行匹配完整的字符串,之後的項是用圓括號捕獲的結果;數組還會包含一個 index屬性,其值為匹配結果中的完整字符串在原字符串中的索引;數組還會包含一個 input屬性, 其值為原字符串。

  • 如果匹配失敗:exec() 方法返回 null。

返回的結果和 str.match(regexp) 中regexp不帶有g時的返回的結果是完全相同的。

對正則表達式對象屬性的更新

對原正則表達式對象做了以下屬性的更新:

  • lastIndex: 下一次匹配開始的位置。就是匹配的完整字符串之後的下一個字符的索引。當正則對象含有 "g" 時,可以在同一個正則對象上多次執行 exec 方法來查找同一個字符串中的多個成功匹配。查找將從正則表達式的 lastIndex 屬性指定的位置開始。
  • ignoreCase: 是否使用了 "i" 標記使正則匹配忽略大小寫
  • global:是否使用了 "g" 標記來進行全局的匹配.
  • multiline:
    是否使用了 "m" 標記使正則工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的開始和結束(行是由 \n 或 \r 分割的),而不只是整個輸入字符串的最開始和最末尾處。)
  • source:正則表達式的字符串(不含igm標記)

示例1

var regexp = /quick\s(brown).+?(jumps)/ig;
var str = ‘The Quick Brown Fox Jumps Over The Lazy Dog, quick brown jumps‘;
var result1 = regexp.exec(str);

/* result1:
[
  "Quick Brown Fox Jumps", 
  "Brown", 
  "Jumps", 
  index: 4, 
  input: "The Quick Brown Fox Jumps Over The Lazy Dog, quick brown jumps", 
  groups: undefined
]
*/

// regexp:
regexp.lastIndex;//25 (即Jumps後面的那個空格符)
regexp.ignoreCase;//true
regexp.global;//true
regexp.multiline;//false
regexp.source;//"quick\s(brown).+?(jumps)"


var result2 = regex.exec(str);

//result2:
/*
 [
  "quick brown jumps", 
  "brown", 
  "jumps", 
  index: 45, 
  input: "The Quick Brown Fox Jumps Over The Lazy Dog, quick brown jumps", 
  groups: undefined
]
*/

//regexp:
regexp.lastIndex;//62
regexp.ignoreCase;//true
regexp.global;//true
regexp.multiline;//false
regexp.source;//"quick\s(brown).+?(jumps)"

3. String.prototype.search()

執行正則表達式和字符串之間的一個搜索匹配。返回字符串中首次完整匹配的索引或-1。

語法

str.match(regexp)
param
  • regexp: 一個正則表達式對象。如果傳入一個非正則表達式對象,則會使用 new RegExp(obj) 隱式地將其轉換為正則表達式對象。
return
  • 如果匹配成功:返回正則表達式在字符串中首次完整匹配的索引。
  • 如果匹配失敗:返回 -1。

示例1:

var str = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz‘;
var regexp = /A(BCD)*/gi;
str.search(regexp); //0

4. RegExp.prototype.test()

執行一個檢索,用來查看正則表達式與指定的字符串是否匹配。返回 true 或 false。

語法

regexp.test(str)
param
  • str: 用來與正則表達式匹配的字符串
return

Type Boolean.如果正則表達式與指定的字符串匹配 ,返回true;否則false。

5. String.prototype.replace

返回一個由替換值替換一些或所有匹配的模式後的新字符串。模式可以是一個字符串或者一個正則表達式, 替換值可以是一個字符串或者一個每次匹配都要調用的函數。原字符串不改變

語法

str.replace(regexp|substr, newSubStr|function)
params
  • pattern:
    • regexp: 一個RegExp對象或者RegExp字面量。該正則所匹配的內容會被第二個參數的返回值替換掉。
    • substr: 一個字符串。其會被第二個參數的返回值替換掉,由於該substr是被視為一個字符串而非正則,所以僅僅是第一個匹配會被替換。
  • replacement:
    • newSubStr: 用於替換掉第一個參數在原字符串中的匹配部分的字符串。該字符串中可以內插一些特殊的變量名。
    • function: 一個用來創建新子字符串的函數,該函數的返回值將替換掉第一個參數匹配到的結果。

newSubStr中可以插入的特殊變量名:

變量名 代表值
$$ ‘$‘
$& 匹配的子串
$` 當前匹配的子串左邊的內容
$‘ 當前匹配的子串右邊的內容
$n n為正整數,如果replace()方法的第一個參數是regexp,則表示第n個捕獲組的匹配結果

function的參數:

變量名 代表值
match 匹配的子串。(對應於上述的$&。)
p1,p2, .. 如果replace()方法的第一個參數是一個RegExp,則代表第n個捕獲組的匹配結果。(對應於上述的$1,$2等。)
offset 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那麽這個參數將是1)
string 被匹配的原字符串。
return

匹配替換後的新字符串。原字符串不變。

示例1:使用function替換正則匹配結果

function replaceFunc(match, p1, p2, p3, offset, string) {
  return [p1, p2, p3].join(‘-‘);
}

var str = ‘abc12345#$*%‘;
var result = str.replace(/([^\d]*)(\d*)([^\w]*)/, replaceFunc)//"abc-12345-#$*%"

示例2: 替換帶有g標誌的正則

var str = ‘Apples are round, and apples are juicy.‘; 
var result = str.replace(/apples/ig, ‘oranges‘);//‘oranges are round, and oranges are juicy‘.

示例3: 重組字符串中的多個子串

var str = ‘John Smith‘;
var result = str.replace(/(\w+)\s(\w+)/,‘$2 and $1‘);//‘Smith and John‘

示例4: 將華氏溫度轉換為對應攝氏溫度

function f2c(x)
{
  function convert(str, p1, offset, s)
  {
    return ((p1-32) * 5/9) + "C";
  }
  var s = String(x);
  var test = /(\d+(?:\.\d*)?)F\b/g;
  return s.replace(test, convert);
}

示例5: 字符串去前後空格 經典!& 常用!

str.replace(/^\s+|\s+$/g, "");

二、常用匹配字符

1.字符類別

字符 含義
. 匹配任意單個字符,除了\n \r \u2028或\u2029
\d 匹配任意阿拉伯數字。等價於[0-9]
\D 匹配任意不是阿拉伯數字的字符。等價於[^0-9]
\w 匹配任意數字字母下劃線。等價於[A-Za-z0-9_]
\W 匹配任意不是數字字母下劃線的字符。等價於[^A-Za-z0-9]
\s 匹配一個空白符,包括空格、制表符、換頁符、換行符、回車符合其他Unicode空格。等價於[ \t\f\n\r\v\u00a0等等]
\S 匹配一個非空白符
\t 匹配一個水平制表符(tab)
\r 匹配一個回車符(carriage return)
\n 匹配一個換行符(linefeed)
\v 匹配一個垂直制表符(vertical tab)
\f 匹配一個換頁符(form-feed)
[\b] 匹配一個退格符(backspace)(不要與 \b 混淆)

2. 邊界

字符 含義
^ 匹配輸入開始。當有m標誌時,將開始和結束字符(^和$)視為在多行上工作(也就是,分別匹配每一行的開始和結束(由 \n 或 \r 分割),而不只是只匹配整個輸入字符串的最開始和最末尾處
$ 匹配輸入結尾。 當有m標誌時,將開始和結束字符(^和$)視為在多行上工作(也就是,分別匹配每一行的開始和結束(由 \n 或 \r 分割),而不只是只匹配整個輸入字符串的最開始和最末尾處
\b 匹配一個零寬單詞邊界,如一個字母和一個空格之間。(不要和 [\b] 混淆)。例如,/\bno/ 匹配 "at noon" 中的 "no",/ly\b/ 匹配 "possibly yesterday." 中的 "ly"。
\B 匹配一個零寬非單詞邊界,如兩個字母之間或兩個空格之間。例如, /\Bon/匹配‘at noon‘中的‘on, /ye\B/匹配‘possibly yesterday‘中的ye。

3. 斷言

字符 含義
x(?=y) 僅匹配被y跟隨的x。y可以是任意的正則字符組合。
x(?!y) 僅匹配不被y跟隨的x。y可以是任意的正則字符組合。例如,舉個例子,/\d+(?!.)/ 只會匹配不被點(.)跟隨的數字。

三. 驗證常用正則表達式

1. 郵箱

簡化版:

 /\S+@\S+\.\S+/

復雜版:

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

2. 用戶名

用戶名正則,4到16位(字母,數字,下劃線,減號)

/^[a-zA-Z0-9_-]{4,16}$/

3. 滿足一定強度的密碼

最少6位,至少包括1個大寫字母、1個小寫字母、1個數字、1個特殊字符:

/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/

檢查某密碼是否滿足該強度:

var pattern=/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
pattern.test(‘Ftc0615!#%^‘)//true

4. 手機號碼正則

/^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$/

5. 身份證號正則

/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/

四、分組與捕獲括號

括號分為 捕獲分組括號,和 僅用於分組的非捕獲型括號兩種。

1.捕獲/分組括號:(...)

普通的無特殊意義的括號通常有兩種功能:分組和捕獲。

捕獲型括號的編號是按照 開括號的次序,從左到右計算的。

如果提供了反向引用,則這些括號內的子表達式匹配的文本可以在表達式的後面部分使用$1、$2來引用。

2.僅用於分組的括號/非捕獲型括號:(?:...)

僅用於分組的括號不能用來提取文本,而只能用來規定多選結構或者量詞的作用對象。

它們不會按照$1、$2編號。

Example:

    (1|one)(?:and|or)(2|two)

這樣匹配之後,$1包含‘1‘或‘one‘,$2包含‘2‘或‘two‘

參考資料

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/match
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/search
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace

https://www.jb51.net/article/115170.htm

《精通正則表達式》

JavaScript正則常用知識總結