Js中RegExp物件
Js中RegExp物件
RegExp
物件表示正則表示式,是由普通字元和特殊字元也叫元字元或限定符組成的文字模板,用於對字串執行模式匹配。
描述
建立一個RegExp
物件通常有兩種方式,一種是通過字面量建立,一種是通過RegExp
物件建構函式建立。
// var regex = /pattern/modifiers; var regex = /^[0-9]+$/g; // var regex = new RegExp("pattern", "modifiers"); var regex = new RegExp("^[0-9]+$", "g");
其中模式pattern
描述了表示式的模式,修飾符modifiers
用於指定全域性匹配、區分大小寫的匹配和多行匹配等等。
i
: 表示執行對大小寫不敏感的匹配。g
: 表示執行全域性匹配即查詢所有匹配而非在找到第一個匹配後停止。m
: 表示執行多行匹配。s
: 表示特殊字元圓點.
中包含換行符,預設.
是匹配除換行符\n
之外的任何單字元,加上s
之後.
中包含換行符。y
: 表示搜尋是否具有粘性,僅從正則表示式的lastIndex
屬性表示的索引處搜尋。u
:Unicode
模式,用來正確處理大於\uFFFF
的Unicode
字元,也就是說能夠正確處理UTF-16
編碼。
RegExp.prototype.compile()
regexObj.compile(pattern, flags)
compile()
方法被用於在指令碼執行過程中重新編譯正則表示式,但是該特性已經從Web
標準中刪除,不推薦compile()
方法,可以使用RegExp
建構函式來得到相同效果。
var regex = /^[0-9]+$/g;
regex = regex.compile("^[0-9]+$", "i");
console.log(regex); // /^[0-9]+$/i
RegExp.prototype.exec()
regexObj.exec(str)
exec()
方法在一個指定字串中執行一個搜尋匹配,返回一個結果陣列或null
global
或sticky
標誌位的情況下,RegExp
物件是有狀態的,其會將上次成功匹配後的位置記錄在lastIndex
屬性中,使用此特性exec()
可用來對單個字串中的多次匹配結果進行逐條的遍歷包括捕獲到的匹配,而相比之下String.prototype.match()
只會返回匹配到的結果。
var regex = /(\d{4})-(\d{2})-(\d{2})/g;
var res = regex.exec("2020-09-02");
console.log(res); // ["2020-09-02", "2020", "09", "02", index: 0, input: "2020-09-02", ... ]
// 進行一次完整的全域性正則匹配需要使用RegExp.prototype.exec()或String.prototype.matchAll()
// 因為當使用String.prototype.match()和/g標誌方式獲取匹配資訊時,捕獲組會被忽略。
const regMatch = (regex, str) => {
var result = [];
var temp = null;
var flags = `${regex.flags}${regex.flags.includes("g") ? "" : "g"}`; // 必須加入g修飾符 否則會陷入死迴圈
regex = new RegExp(regex, flags);
while (temp = regex.exec(str)) result.push(temp);
return result;
}
RegExp.prototype.test()
regexObj.test(str)
test()
方法執行一個檢索,用來檢視正則表示式與指定的字串是否匹配,返回true
或false
。
var regex = /^[0-9]+$/g;
console.log(regex.test("1")); // true
String.prototype.search()
str.search(regexp)
search()
方法執行正則表示式和String
物件之間的一個搜尋匹配,如果傳入一個非正則表示式物件regexp
,則會使用new RegExp(regexp)
隱式地將其轉換為正則表示式物件,如果匹配成功,則search()
返回正則表示式在字串中首次匹配項的索引,否則返回-1
。
var regex = /[0-9]+/g;
console.log("s123".search(regex)); // 1
String.prototype.match()
match()
方法檢索返回一個字串匹配正則表示式的結果,如果傳入一個非正則表示式物件,則會隱式地使用new RegExp(obj)
將其轉換為一個RegExp
,如果沒有給出任何引數並直接使用match()
方法 ,將會得到一個包含空字串的Array
即[""]
,如果使用g
標誌,則將返回與完整正則表示式匹配的所有結果,但不會返回捕獲組,如果未使用g
標誌,則僅返回第一個完整匹配及其相關的捕獲組Array
。
var regex = /(\d{4})-(\d{2})-(\d{2})/g;
var res = "2020-09-02".match(regex);
console.log(res); // ["2020-09-02"]
String.prototype.matchAll()
str.matchAll(regexp)
matchAll()
方法返回一個包含所有匹配正則表示式的結果及分組捕獲組的迭代器,如果傳入一個非正則表示式物件,則會隱式地使用new RegExp(obj)
將其轉換為一個RegExp
,傳入的RegExp
必須是設定了全域性模式g
的形式,否則會丟擲異常TypeError
,返回一個迭代器,不可重用,結果耗盡需要再次呼叫方法,獲取一個新的迭代器。matchAll
內部做了一個regexp
的複製,所以不像regexp.exec
,lastIndex
在字串掃描時不會改變。
var regex = /(\d{4})-(\d{2})-(\d{2})/g;
var res = "2020-09-02".matchAll(regex);
console.log([...res]); // 使用Spread操作符展開 也可以呼叫next()方法進行迭代
// [["2020-09-02", "2020", "09", "02", index: 0, input: "2020-09-02", ... ]]
String.prototype.replace()
str.replace(regexp|substr, newSubStr|function)
replace()
方法返回一個由替換值replacement
替換部分或所有的模式pattern
匹配項後的新字串,模式可以是一個字串或者一個正則表示式,替換值可以是一個字串或者一個每次匹配都要呼叫的回撥函式,如果pattern
是字串,則僅替換第一個匹配項,原字串不會改變。
var regex = /\d+/g;
var res = "s1s11s111".replace(regex, "");
console.log(res); // sss
String.prototype.split()
str.split([separator[, limit]])
split()
方法使用指定的分隔符字串將一個String
物件分割成子字串陣列,以一個指定的分割字串來決定每個拆分的位置,separator
指定表示每個拆分應發生的點的字串,separator
可以是一個字串或正則表示式,limit
提供一個整數,限定返回的分割片段數量,返回源字串以分隔符出現位置分隔而成的一個Array
。
var regex = /\d+/g; // 以數字分割
var res = "2020-09-02".split(regex);
console.log(res); // ["", "-", "-", ""]
屬性
get RegExp[@@species]
: 靜態屬性,RegExp[@@species]
訪問器屬性返回RegExp
的構造器。RegExp.lastIndex
:lastIndex
是正則表示式的一個可讀可寫的整型屬性,用來指定下一次匹配的起始索引。RegExp.prototype.flags
:flags
屬性返回一個字串,由當前正則表示式物件的標誌組成。RegExp.prototype.dotAll
:dotAll
屬性表明是否在正則表示式中一起使用s
修飾符。RegExp.prototype.global
:global
屬性表明正則表示式是否使用了g
修飾符。RegExp.prototype.ignoreCase
:ignoreCase
屬性表明正則表示式是否使用了i
修飾符。RegExp.prototype.multiline
:multiline
屬性表明正則表示式是否使用了m
修飾符。RegExp.prototype.source
:
source
屬性返回一個值為當前正則表示式物件的模式文字的字串。RegExp.prototype.sticky
:sticky
屬性表明正則表示式是否使用了y
修飾符。RegExp.prototype.unicode
:unicode
屬性表明正則表示式帶有u
修飾符。
方法
RegExp.prototype.compile()
regexObj.compile(pattern, flags)
compile()
方法被用於在指令碼執行過程中重新編譯正則表示式,但是該特性已經從Web
標準中刪除,不推薦compile()
方法,可以使用RegExp
建構函式來得到相同效果。
var regex = /^[0-9]+$/g;
regex = regex.compile("^[0-9]+$", "i");
console.log(regex); // /^[0-9]+$/i
RegExp.prototype.exec()
regexObj.exec(str)
exec()
方法在一個指定字串中執行一個搜尋匹配,返回一個結果陣列或null
,在設定了global
或sticky
標誌位的情況下,RegExp
物件是有狀態的,其會將上次成功匹配後的位置記錄在lastIndex
屬性中,使用此特性exec()
可用來對單個字串中的多次匹配結果進行逐條的遍歷包括捕獲到的匹配,而相比之下String.prototype.match()
只會返回匹配到的結果。
var regex = /(\d{4})-(\d{2})-(\d{2})/g;
var res = regex.exec("2020-09-02");
console.log(res); // ["2020-09-02", "2020", "09", "02", index: 0, input: "2020-09-02", ... ]
// 進行一次完整的全域性正則匹配需要使用RegExp.prototype.exec()或String.prototype.matchAll()
// 因為當使用String.prototype.match()和/g標誌方式獲取匹配資訊時,捕獲組會被忽略。
const regMatch = (regex, str) => {
var result = [];
var temp = null;
var flags = `${regex.flags}${regex.flags.includes("g") ? "" : "g"}`; // 必須加入g修飾符 否則會陷入死迴圈
regex = new RegExp(regex, flags);
while (temp = regex.exec(str)) result.push(temp);
return result;
}
RegExp.prototype.test()
regexObj.test(str)
test()
方法執行一個檢索,用來檢視正則表示式與指定的字串是否匹配,返回true
或false
。
var regex = /^[0-9]+$/g;
console.log(regex.test("1")); // true
RegExp.prototype[@@match]()
regexp[Symbol.match](str)
對正則表示式匹配字串時,[@@match]()
方法用於獲取匹配結果,這個方法的使用方式和String.prototype.match()
相同,不同之處是this
和引數順序。
var regex = /(\d{4})-(\d{2})-(\d{2})/g;
var res = regex[Symbol.match]("2020-09-02");
console.log(res); // ["2020-09-02"]
RegExp.prototype[@@matchAll]()
regexp[Symbol.matchAll](str)
[@@matchAll]
方法返回對字串使用正則表示式的所有匹配項,這個方法的使用方式和String.prototype.matchAll()
相同,不同之處是this
和引數順序。
var regex = /(\d{4})-(\d{2})-(\d{2})/g;
var res = regex[Symbol.matchAll]("2020-09-02");
console.log([...res]); // // [["2020-09-02", "2020", "09", "02", index: 0, input: "2020-09-02", ... ]]
RegExp.prototype[@@replace]()
regexp[Symbol.replace](str, newSubStr|function)
[@@replace]()
方法會在一個字串中用給定的替換器,替換所有符合正則模式的匹配項,並返回替換後的新字串結果,用來替換的引數可以是一個字串或是一個針對每次匹配的回撥函式,這個方法基本可以和String.prototype.replace()
一樣使用,不同之處是this
和引數順序。
var regex = /\d+/g;
var res = regex[Symbol.replace]("s1s11s111", "");
console.log(res); // sss
RegExp.prototype[@@search]()
regexp[Symbol.search](str)
[@@search]()
方法執行了一個在給定字串中的一個搜尋以取得匹配正則模式的項,這個方法的使用方式和String.prototype.search()
相同,不同之處是this
和引數順序。
var regex = /\d+/g;
var res = regex[Symbol.search]("s1s11s111");
console.log(res); // 1
RegExp.prototype[@@split]()
[@@split]()
方法切割String
物件為一個其子字串的陣列,這個方法的使用方式和 String.prototype.split()
相同,不同之處是this
和引數順序。
var regex = /\d+/g;
var res = regex[Symbol.split]("2020-09-02");
console.log(res); // ["", "-", "-", ""]
RegExp.prototype.toString()
regexObj.toString()
toString() 返回一個表示該正則表示式的字串。
var regex = /\d+/g;
console.log(regex.toString()); // /\d+/g
正則規則
元字元的規則列表以及它們在正則表示式上下文中的行為,該部分出自https://www.runoob.com/regexp/regexp-metachar.html
。
\
: 將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後引用、或一個八進位制轉義符,例如n
匹配字元n
,\n
匹配一個換行符,序列\\
匹配\
而\(
則匹配("
。^
: 匹配輸入字串的開始位置,如果設定了RegExp
物件的Multiline
屬性,^
也匹配\n
或\r
之後的位置。$
: 匹配輸入字串的結束位置,如果設定了RegExp
物件的Multiline
屬性,$
也匹配\n
或\r
之前的位置。*
: 匹配前面的子表示式零次或多次,例如zo*
能匹配z
以及zoo
,*
等價於{0,}
。+
: 匹配前面的子表示式一次或多次,例如zo+
能匹配zo
以及zoo
,但不能匹配z
,+
等價於{1,}
。?
: 匹配前面的子表示式零次或一次,例如do(es)?
可以匹配do
或does
,?
等價於{0,1}
。{n}
:n
是一個非負整數,匹配確定的n
次,例如o{2}
不能匹配Bob
中的o
,但是能匹配food
中的兩個o
。{n,}
:n
是一個非負整數,至少匹配n
次,例如o{2,}
不能匹配Bob
中的o
,但能匹配foooood
中的所有o
,o{1,}
等價於o+
,o{0,}
則等價於o*
。{n,m}
:m
和n
均為非負整數,其中n <= m
,最少匹配n
次且最多匹配m
次,例如o{1,3}
將匹配fooooood
中的前三個o
,o{0,1}
等價於o?
,請注意在逗號和兩個數之間不能有空格。?
: 當該字元緊跟在任何一個其他限制符(*, +, ?, {n}, {n,}, {n,m})
後面時,匹配模式是非貪婪的,非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串,例如對於字串oooo
,o+?
將匹配單個o
,而o+
將匹配所有o
。.
: 匹配除換行符(\n、\r)
之外的任何單個字元,要匹配包括\n
在內的任何字元,請使用像(.|\n)
的模式。(pattern)
: 匹配pattern
並獲取這一匹配,所獲取的匹配可以從產生的Matches
集合得到,在VBScript
中使用SubMatches
集合,在JS
中則使用$1…$9
屬性,要匹配圓括號字元,請使用\(
或\)
。(?:pattern)
: 匹配pattern
但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行儲存供以後使用,這在使用字元|
來組合一個模式的各個部分是很有用,例如industr(?:y|ies)
就是一個比industry|industries
更簡略的表示式。(?=pattern)
: 正向肯定預查look ahead positive assert
,在任何匹配pattern
的字串開始處匹配查詢字串,這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用,例如Windows(?=95|98|NT|2000)
能匹配Windows2000
中的Windows
,但不能匹配Windows3.1
中的Windows
,預查不消耗字元,也就是說在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。(?!pattern)
: 正向否定預查negative assert
,在任何不匹配pattern
的字串開始處匹配查詢字串,這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用,例如Windows(?!95|98|NT|2000)
能匹配Windows3.1
中的Windows
,但不能匹配Windows2000
中的Windows
,預查不消耗字元,也就是說在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。(?<=pattern)
: 反向look behind
肯定預查,與正向肯定預查類似,只是方向相反,例如(?<=95|98|NT|2000)Windows
能匹配2000Windows
中的Windows
,但不能匹配3.1Windows
中的Windows
。(?<!pattern)
: 反向否定預查,與正向否定預查類似,只是方向相反,例如(?<!95|98|NT|2000)Windows
能匹配3.1Windows
中的Windows
,但不能匹配2000Windows
中的Windows
。x|y
: 匹配x
或y
,例如z|food
能匹配z
或food
,(z|f)ood
則匹配zood
或food
。[xyz]
: 字元集合,匹配所包含的任意一個字元,例如[abc]
可以匹配plain
中的a
。[^xyz]
: 負值字元集合。匹配未包含的任意字元,例如[^abc]
可以匹配plain
中的p
、l
、i
、n
。[a-z]
: 字元範圍,匹配指定範圍內的任意字元,例如[a-z]
可以匹配a
到z
範圍內的任意小寫字母字元。[^a-z]
: 負值字元範圍,匹配任何不在指定範圍內的任意字元,例如[^a-z]
可以匹配任何不在a
到z
範圍內的任意字元。\b
: 匹配一個單詞邊界,也就是指單詞和空格間的位置,例如er\b
可以匹配never
中的er
,但不能匹配verb
中的er
。\B
: 匹配非單詞邊界,er\B
能匹配verb
中的er
,但不能匹配never
中的er
。\cx
: 匹配由x
指明的控制字元,例如\cM
匹配一個Control-M
或回車符,x
的值必須為A-Z
或a-z
之一,否則將c
視為一個原義的c
字元。\d
: 匹配一個數字字元,等價於[0-9]
。\D
: 匹配一個非數字字元,等價於[^0-9]
。\f
: 匹配一個換頁符,等價於\x0c
和\cL
。\n
: 匹配一個換行符,等價於\x0a
和\cJ
。\r
: 匹配一個回車符,等價於\x0d
和\cM
。\s
: 匹配任何空白字元,包括空格、製表符、換頁符等等,等價於[ \f\n\r\t\v]
。\S
: 匹配任何非空白字元,等價於[^ \f\n\r\t\v]
。\t
: 匹配一個製表符,等價於\x09
和\cI
。\v
: 匹配一個垂直製表符,等價於\x0b
和\cK
。\w
: 匹配字母、數字、下劃線,等價於[A-Za-z0-9_]
。\W
: 匹配非字母、數字、下劃線,等價於[^A-Za-z0-9_]
。\xn
: 匹配n
,其中n
為十六進位制轉義值,十六進位制轉義值必須為確定的兩個數字長,例如\x41
匹配A
,\x041
則等價於\x04
與1
,正則表示式中可以使用ASCII
編碼。\num
: 匹配num
,其中num
是一個正整數,對所獲取的匹配的引用,例如(.)\1
匹配兩個連續的相同字元。\n
: 標識一個八進位制轉義值或一個向後引用,如果\n
之前至少n
個獲取的子表示式,則n
為向後引用,否則如果n
為八進位制數字0-7
,則n
為一個八進位制轉義值。\nm
: 標識一個八進位制轉義值或一個向後引用,如果\nm
之前至少有nm
個獲得子表示式,則nm
為向後引用,如果\nm
之前至少有n
個獲取,則n
為一個後跟文字m
的向後引用。如果前面的條件都不滿足,若 n 和 m 均為八進位制數字 (0-7),則 \nm 將匹配八進位制轉義值nm
。\nml
: 如果n
為八進位制數字0-7
,且m
和l
均為八進位制數字0-7
,則匹配八進位制轉義值nml
。\un
: 匹配n
,其中n
是一個用四個十六進位制數字表示的Unicode
字元,例如\u00A9
匹配版權符號。
示例
該部分出自https://c.runoob.com/front-end/854
。
校驗數字的表示式
- 數字:
^[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|4|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-4405222、021-87888822)
:\d{3}-\d{8}|\d{4}-\d{7}
。 - 電話號碼正則表示式(支援手機號碼,
3-4
位區號,7-8
位直播號碼,1-4
位分機號):((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
。 - 身份證號(
15
位、18
位數字),最後一位是校驗位,可能為數字或字元X
:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
。 - 帳號是否合法(字母開頭,允許
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])[a-zA-Z0-9]{8,10}$
。 - 強密碼(必須包含大小寫字母和數字的組合,可以使用特殊字元,長度在
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)$
。 - 錢的輸入格式,精確到小數點後兩位:
^[0-9]+(.[0-9]{1,2})?$
。 xml
檔案:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
。- 中文字元的正則表示式:
[\u4e00-\u9fa5]
。 - 雙位元組字元:
[^\x00-\xff]
(包括漢字在內,可以用來計算字串的長度(一個雙位元組字元長度計2
,ASCII
字元計1
))。 - 空白行的正則表示式:
\n\s*\r
(可以用來刪除空白行)。 HTML
標記的正則表示式:<(\S*?)[^>]*>.*?|<.*? />
。- 首尾空白字元的正則表示式:
^\s*|\s*$或(^\s*)|(\s*$)
(可以用來刪除行首行尾的空白字元(包括空格、製表符、換頁符等等))。 - 騰訊
QQ
號:[1-9][0-9]{4,}
(騰訊QQ
號從10000
開始)。 - 中國郵政編碼:
[1-9]\d{5}(?!\d)
(中國郵政編碼為6
位數字)。 IP
地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
。
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://c.runoob.com/front-end/854
https://www.jianshu.com/p/7dbf4a1e6805
https://juejin.im/post/6844903816781889543
https://www.runoob.com/regexp/regexp-metachar.html
https://www.cnblogs.com/y896926473/articles/6366222.html
https://www.cnblogs.com/kevin-yuan/archive/2012/09/25/2702167.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp