RegExp 正規表達式 in JavaScript

JavaScript
RegExp

參考文件MDN


建立RegExp物件

方法一:用前後各一個 / 包住字串或特殊字元符,載入效能相對較佳

var regex_obj = /usa+da/


方法二:new RegExp(),適合動態產生對應的判定之場合

var regex_obj = new RegExp('usa+da')


特殊字元

反斜線 \

1. 放在非特殊字元前後可作為block(間隔、空白)

console.log(/\bter\b/.test("interest"));   //false
console.log(/\bter\b/.test("in ter est"));   //true


2. 放在特殊字元前則將特殊字元轉換成一般符性質

console.log(/aaaa*/g.test("caaady"));  //true
console.log(/a\*/.test("caaady"));       //false   乃找出是否包含"a*"


3. 要打出1個反斜線的話,需\\,JavaScript內也是

console.log(">\\ \\<");  //輸出 >\ \<
console.log(/[\\][\\]/.test(">\\ \\<"));    //false
console.log(/[\\]/.test(">\\ \\<"));  //true


插入符(Caret) ^

匹配輸入的開頭,放匹配字元前

注意:若是插入符在方括號內(字元集),則有不同意思!表示[]中寫入的字元將被否定,匹配非出現在bracket中的符號

console.log(/^U/.test("usada"));   //false
console.log(/^U/.test("Usada"));   //true


金錢符(Dollar Sign) $

匹配輸入的結尾,放匹配字元後

console.log(/o$/.test("Usada pekora"));  //false
console.log(/o$/.test("Usada Peko"));    //true


乘號 *

匹配前一字元0次到多次

console.log(/pekopekope*/.test("pekopeeee"));   //false,沒有先符合"pekopeko"
console.log(/pekopekope*/.test("pekopekopeeee"));   //true


加號 +

乘號的兄弟,匹配前一字元1次以上,等同於{1,}

console.log(/peko+/.test("pekopeeee"));  //true
console.log(/peko+/.test("peeeekoooooo"));   //false ,缺少"pek"


問號 ?

匹配前一字元0~1次,等同於{0,1}

console.log(/p?eko?/.test("pe kooo"));  //false  缺少"ek"
console.log(/p?eko?/.test("Seky"));    //true
console.log(/p?eko?/.test("SleepSekyoon"));   //true


小數點 .

匹配除了換行符號之外的單一字元

console.log(/.ko/.test("Usada Pekora"));  //true
console.log(/.ko/.test("kono Suba"));   //false "ko"前面缺少換行符號外的任一單一字元


小括號 ( ) Capturing Parentheses

匹配()內字元並記住此次匹配,說明範例直接copy CDN

 /(foo) (bar) \1 \2/ 中的 (foo) 與 (bar) 可匹配了 "foo bar foo bar" 這段文字中的前兩個字,而 \1 與 \2 則匹配了後面的兩個字。
注意, \1, \2, ..., \n 代表的就是前面的pattern,以本範例來說,/(foo) (bar) \1 \2/ 等同於 /(foo) (bar) (foo) (bar)/。


中括號/方括號 [ ]

字元的集合,小數點與乘號在[ ]中不具特殊意義,會匹配[ ]內所有出現的字元

console.log(/[p]/.test("Usada Pekora"));  //false,沒有小p
console.log(/[pk]/.test("Usada Pekora")); //true,至少有"k"

預設定[ ]內字元範圍的集合,可使用減號" - ",如MDN說明範例

[^abc]可以寫作[^a-c]. "brisket" 中找到 'r' 、"chop."中找到 'h'


大括號/花括號 { }

第一種:{n}

規定符號確切發生為n次

console.log(/(peko){2}/.test("pekopekopeko"));   //true
console.log(/(peko){2}/.test("pekopeeeee"));    //false


第二種:{n,m}

規定符號至少發生n次且至多發生m次,m不可為零

console.log(/(peko){1,2}/.test("pekopeeeee"));   //true
console.log(/(peko){1,2}/.test("peeeeeko"));     //false
console.log(/(peko){0,2}/.test("peeeeeko"));     //true


棒棒符(我不知它叫啥..) |

"or"的意思,x|y表示符合x或y

console.log(/p|P/.test("pekopekopeko"));   //true
console.log(/p|P/.test("qoo"));            //false


反斜線之各種吻合判定

\b:吻合文字邊界
\B:吻合非文字邊界
\d:吻合數字,等同[0-9]
\D:吻合非數字,等同[^0-9]
\s:吻合單一空白字符(空白、tab、跳頁字元等),等效於這一串[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\S:吻合非空白字符的其他單一字元(跟\s相反的意思)
\w:吻合字母與底線,等同[A-Za-z0-9_]
\W:吻合非字(non-word)字元,[^A-Za-z0-9_]
\正整數:前面小括號提到的,會refer to 前方第n個小括號內的匹配
\0:吻合NULL(U+0000)字符


後續更多應用待補~Ovo

© 2021 Hamsterism. All rights reserved github