正則表達式
- 正則表達式
- 創建一個正則表達式
- 修飾符
- 常用的特殊字符
- 使用正則表達式的方法
- replace
- 指定字符串作為替換項
- 使用場景:
- 交換字符串中的兩個單詞
- 將"-"鏈接的方式改為駝峰式(忽略開頭的-)
- 將華氏溫度轉換為響應的攝氏溫度
- 常用正則示例
- 判斷輸入是否是正確的郵箱格式
- 給定字符串 str,檢查其是否符合美元書寫格式(小數部分若有,則小數長度為2)
- 匹配純數字或純小寫字母或純大寫字母,且長度在5-16之間(不能輸入特殊字符)
- 允許數字、大小寫字母、但至少包含其中兩種,且長度在8-16之間(不能是純數字、純小寫字母、純大寫字母,不能輸入特殊字符)
- 密碼中同時包含數字、大小寫字母,且長度在6-20之間(不能輸入特殊字符)
- 密碼中同時含字母(大或小)和數字且長度在6-20之間(不能輸入特殊字符)
- 匹配11位,以137、139、188、186開頭的手機號
參考鏈接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_expressions
正則表達式是用于匹配字符串中字符組合的模式 這些模式被用于 RegExp 的 exec 和 test 方法,以及 String 的 match、matchAll、replace、search 和 split 方法
正則表達式
正則表達式是用于匹配字符串中字符組合的模式
創建一個正則表達式
- 字面量方式:
/正則表達式/修飾符(可選)
const reg = /ab+c/i;
console.log(reg.test('abb')) // false
console.log(reg.test('abc')) // true
console.log(reg.test('abbc')) // true
- 調用RegExp對象的構造函數
const reg = new RegExp("ab+c");
修飾符
修飾符 | 含義 |
---|---|
i | 執行對大小寫不敏感的匹配。 |
g | 執行全局匹配(查找所有匹配而非在找到第一個匹配后停止) |
m | 執行多行匹配。 |
const str = 'dog cat and dog'
console.log(str.replace(/dog/, '')) // cat and dog
console.log(str.replace(/Dog/i, '')) // cat and dog
console.log(str.replace(/Dog/ig, '')) // cat and
常用的特殊字符
字符 | 含義 |
---|---|
\ | 1. 在非特殊字符之前的反斜杠表示下一個字符是特殊字符,不能按照字面理解。例:前面沒有 “” 的 “b” 通常匹配小寫字母 “b”,但如果前面加了 “”,它將不再匹配任何字符,而是表示一個字符邊界。 2. 在特殊字符之前的反斜杠表示下一個字符不是特殊字符,應該按照字面理解。 如果你想將字符串傳遞給 RegExp 構造函數,不要忘記在字符串字面量中反斜杠是轉義字符: /[a-z]\s/i 和 new RegExp("[a-z]\\s", "i") 創建了相同的正則表達式 |
^ | 匹配輸入的開始。 例:/^A/ 并不會匹配 “an A” 中的 ‘A’,但是會匹配 “An E” 中的 'A |
$ | 匹配輸入的結束。 例:/t$/ 并不會匹配 “eater” 中的 ‘t’,但是會匹配 “eat” 中的 ‘t’ |
* | 匹配前一個表達式 0 次或多次。等價于 {0,} 例如,/bo*/ 會匹配 “A ghost boooooed” 中的 ‘booooo’ 和 “A bird warbled” 中的 ‘b’,但是在 “A goat grunted” 中不會匹配任何內容 |
+ | 匹配前面一個表達式 1 次或者多次。等價于 {1,} 例如,/a+/ 會匹配 “candy” 中的 ‘a’ 和 “caaaaaaandy” 中所有的 ‘a’,但是在 “cndy” 中不會匹配任何內容 |
? | 匹配前面一個表達式 0 次或者 1 次。等價于 {0,1} |
. | (小數點)默認匹配除換行符之外的任何單個字符 例如,/.n/ 將會匹配 “nay, an apple is on the tree” 中的 ‘an’ 和 ‘on’,但是不會匹配 ‘nay’。 |
(x) | 它會匹配 ‘x’ 并且記住匹配項。其中括號被稱為捕獲括號 例:模式 /(foo) (bar) \1 \2/ 中的 ‘(foo)’ 和 ‘(bar)’ 匹配并記住字符串 “foo bar foo bar” 中前兩個單詞。模式中的 \1 和 \2 表示第一個和第二個被捕獲括號匹配的子字符串,即 foo 和 bar,匹配了原字符串中的后兩個單詞。 而在正則表達式的替換環節,則要使用像 $1、 2 、 . . . 、 2、...、 2、...、n 這樣的語法,例如,‘bar foo’.replace(/(…) (…)/, '$2 1 ′ ) 。 1')。 1′)。& 表示整個用于匹配的原字符串 |
(?:x) | 匹配 ‘x’ 但是不記住匹配項。這種括號叫作非捕獲括號 |
x(?=y) | 匹配’x’僅僅當’x’后面跟著’y’.這種叫做先行斷言。 |
(?<=y)x | 匹配’x’僅當’x’前面是’y’.這種叫做后行斷言 |
x(?!y) | 僅僅當’x’后面不跟著’y’時匹配’x’,這被稱為正向否定查找 |
(?<!y)x | 僅僅當’x’前面不是’y’時匹配’x’,這被稱為反向否定查找。 |
{n} | n 是一個正整數,匹配了前面一個字符剛好出現了 n 次 |
{n,} | n 是一個正整數,匹配前一個字符至少出現了 n 次。 |
{n,m} | n 和 m 都是整數。匹配前面的字符至少 n 次,最多 m 次。如果 n 或者 m 的值是 0,這個值被忽略。 |
[xyz] | 一個字符集合。匹配方括號中的任意字符,包括轉義序列。你可以使用破折號(-)來指定一個字符范圍。對于點(.)和星號(*)這樣的特殊符號在一個字符集中沒有特殊的意義。 例:[abcd] 和 [a-d] 是一樣的。他們都匹配"brisket"中的‘b’,也都匹配“city”中的‘c’ |
[^xyz] | 一個反向字符集。也就是說, 它匹配任何沒有包含在方括號中的字符 |
[\b] | 匹配一個退格 (U+0008)(與\b不一樣) |
\b | 匹配一個詞的邊界。 例:/\bm/匹配“moon”中的‘m’;/oo\b/并不匹配"moon"中的’oo’,因為’oo’被一個“字”字符’n’緊跟著。 /oon\b/匹配"moon"中的’oon’,因為’oon’是這個字符串的結束部分。這樣他沒有被一個“字”字符緊跟著 |
\B | 匹配一個非單詞邊界 |
\d | 匹配一個數字。等價于 [0-9] |
\D | 匹配一個非數字字符。等價于 [^0-9] |
\s | 匹配一個空白字符,包括空格、制表符、換頁符和換行符。 |
\S | 匹配一個非空白字符 |
\w | 匹配一個單字字符(字母、數字或者下劃線)。等價于 [A-Za-z0-9_] |
\W | 匹配一個非單字字符。等價于 [^A-Za-z0-9_] |
\n | 在正則表達式中,它返回最后的第 n 個子捕獲匹配的子字符串 (捕獲的數目以左括號計數)。 |
使用正則表達式的方法
replace
String.prototype.replace(pattern, replacement)方法返回一個新字符串,其中一個、多個或所有匹配的 pattern 被替換為 replacement。pattern 可以是字符串或 RegExp,replacement 可以是字符串或一個在每次匹配時調用的函數。如果 pattern 是字符串,則只會替換第一個匹配項。原始的字符串不會改變
const str = "Ruth's dog is your dog"
console.log(str.replace("Ruth's", 'my')) // my dog is your dog
console.log(str.replace(/Dog/i, 'cat')) // Ruth's cat is your dog
指定字符串作為替換項
模式 | 插入值 |
---|---|
$$ | 插入一個 “$” |
$& | 插入匹配的子字符串 |
$` | 插入匹配子字符串之前的字符串片段 |
$’ | 插入匹配子字符串之后的字符串片段 |
$n | 插入第 n(索引從 1 開始)個捕獲組,其中 n 是小于 100 的正整數。 |
$ | 插入名稱為 Name 的命名捕獲組 |
replace() 替換多次的唯一情況是傳入帶有 g 標志的正則表達式
如果 pattern 是一個空字符串,則替換項將被插入到字符串的開頭
"xxx".replace("", "_"); // "_xxx"
若replacement為函數,該函數具有以下簽名
function replacer(match, p1, p2, /* …, */ pN, offset, string, groups) {return replacement;
}
// 參數如下所示
match: 匹配的子字符串(對應$&)
p1, p2, …pN: 如果 replace() 的第一個參數是 RegExp 對象,則為捕獲組(包括命名捕獲組)找到的第 n 個字符串。(對應于上面的 $1、$2 等。)例如,如果 pattern 是 /(\a+)(\b+)/,則 p1 是 \a+ 的匹配項,p2 是 \b+ 的匹配項。如果該組是分支的一部分(例如 "abc".replace(/(a)|(b)/, Replacer)),則不匹配的替代項將為 undefined
offset: 原始字符串中匹配子字符串的偏移量。例如,如果整個字符串是 'abcd',而匹配的子字符串是 'bc',那么這個參數將是 1
string: 正在檢查的原始字符串
groups: 一個捕獲組命名組成的對象,值是匹配的部分(如果沒有匹配,則為 undefined)。僅在 pattern 包含至少一個命名捕獲組時才存在
參數的確切數量取決于第一個參數是否為 RegExp 對象,以及它有多少個捕獲組
function replacer(match, $1, $2, $3, offset, string, groups) {console.log(match) // abc12345#$*%console.log($1) // abc, $2為12345,$3為#$*%console.log(offset) // 0 (偏移量)console.log(string) // abc12345#$*%console.log(groups) // undefined
}
const newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
使用場景:
交換字符串中的兩個單詞
const re = /(\w+)\s(\w+)/;
const str = "Maria Cruz";
const newstr = str.replace(re, "$2, $1"); // Cruz, Maria
將"-"鏈接的方式改為駝峰式(忽略開頭的-)
const str = '-webkit-border-image'
const strName = str.replace(/^-/, "").replace(/-([a-z])/g, (_, $1) => $1.toUpperCase()) // webkitBorderImage
將華氏溫度轉換為響應的攝氏溫度
function f2c(x) {function convert(str, p1, offset, s) {return `${((p1 - 32) * 5) / 9}C`;}const s = String(x);const test = /(-?\d+(?:\.\d*)?)F\b/g;return s.replace(test, convert);
}
console.log(f2c('0F')) // -17.77777777777778C
常用正則示例
判斷輸入是否是正確的郵箱格式
let regemail = /^[\w\._-]+@[\w]+[\.\w]+$/
給定字符串 str,檢查其是否符合美元書寫格式(小數部分若有,則小數長度為2)
let reg = /^\$\d{1,3}(,\d{3})*(\.\d{2})?$/
匹配純數字或純小寫字母或純大寫字母,且長度在5-16之間(不能輸入特殊字符)
let reg11 = /^(\d+|[a-z]+|[A-Z]+)$/
// console.log(reg11.test('ZZZZ')) // false:111aa,ZZZZ1 ;true:aaaaa,111,ZZZZ
允許數字、大小寫字母、但至少包含其中兩種,且長度在8-16之間(不能是純數字、純小寫字母、純大寫字母,不能輸入特殊字符)
let reg10 = /^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/
// console.log(reg10.test('ZZZZZZz')) // false:123123123,ZZZZZZZ,ZZZZZZ!!!,ZZZZZZz ;true:12312aaaaa,ZZZZZ12312aaaaa
密碼中同時包含數字、大小寫字母,且長度在6-20之間(不能輸入特殊字符)
let reg9 = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[\da-zA-Z]{6,20}$/
// console.log(reg9.test('Z23qwe')) // false:123qwe,123qwe!!!,ZZZ123qwe!!! true:123qweZZZ, Z23qwe
密碼中同時含字母(大或小)和數字且長度在6-20之間(不能輸入特殊字符)
let reg8 = /^(?=.*\d)(?=.*[a-zA-Z])[\da-zA-Z]{8,16}$/
// console.log(reg8.test('Z12345ZZ!!')) // false:'abcdefgh','agh1','Z12345ZZ!!' true:abcdefgh1,Zgh12345,Z12345ZZ
匹配11位,以137、139、188、186開頭的手機號
let reg5 = /^(^137|139|188|186)[0-9]{8}$/
// console.log(reg5.exec('18664570316'))