1. 程式人生 > 實用技巧 >Js中RegExp物件

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模式,用來正確處理大於\uFFFFUnicode字元,也就是說能夠正確處理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

,在設定了globalsticky標誌位的情況下,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()方法執行一個檢索,用來檢視正則表示式與指定的字串是否匹配,返回truefalse

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,在設定了globalsticky標誌位的情況下,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()方法執行一個檢索,用來檢視正則表示式與指定的字串是否匹配,返回truefalse

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)?可以匹配dodoes?等價於{0,1}
  • {n}: n是一個非負整數,匹配確定的n次,例如o{2}不能匹配Bob中的o,但是能匹配food中的兩個o
  • {n,}: n是一個非負整數,至少匹配n次,例如o{2,}不能匹配Bob中的o,但能匹配foooood中的所有oo{1,}等價於o+o{0,}則等價於o*
  • {n,m}: mn均為非負整數,其中n <= m,最少匹配n次且最多匹配m次,例如o{1,3}將匹配fooooood中的前三個oo{0,1}等價於o?,請注意在逗號和兩個數之間不能有空格。
  • ?: 當該字元緊跟在任何一個其他限制符(*, +, ?, {n}, {n,}, {n,m})後面時,匹配模式是非貪婪的,非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串,例如對於字串ooooo+?將匹配單個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: 匹配xy,例如z|food能匹配zfood(z|f)ood則匹配zoodfood
  • [xyz]: 字元集合,匹配所包含的任意一個字元,例如[abc]可以匹配plain中的a
  • [^xyz]: 負值字元集合。匹配未包含的任意字元,例如[^abc]可以匹配plain中的plin
  • [a-z]: 字元範圍,匹配指定範圍內的任意字元,例如[a-z]可以匹配az範圍內的任意小寫字母字元。
  • [^a-z]: 負值字元範圍,匹配任何不在指定範圍內的任意字元,例如[^a-z]可以匹配任何不在az範圍內的任意字元。
  • \b: 匹配一個單詞邊界,也就是指單詞和空格間的位置,例如er\b可以匹配never中的 er,但不能匹配verb中的er
  • \B: 匹配非單詞邊界,er\B能匹配verb中的er,但不能匹配never中的er
  • \cx: 匹配由x指明的控制字元,例如\cM匹配一個Control-M或回車符,x的值必須為A-Za-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則等價於\x041,正則表示式中可以使用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,且ml均為八進位制數字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-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXX: ^(\(\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-091-12): ^(0?[1-9]|1[0-2])$
  • 一個月的31天(01-091-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](包括漢字在內,可以用來計算字串的長度(一個雙位元組字元長度計2ASCII字元計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