Character classes
字元類別
Regex 中定義了一些字元,來表示特定的字元集合
例如:[0-9]
用來匹配阿拉伯數字 0~9,可以用簡化用 \d
表示[A-Za-z0-9_]
用來匹配所有英文字母 & 數字 & 底線,可以簡化用 \w
表示
一些常用的集合有特定字元可以表示
簡寫 | 說明 |
---|---|
\d |
digit: 數字 0~9。等同於 [0-9] |
\s |
space: 空格字元。 包含空格、tabs\t 、換行符號\n |
\w |
wordly: 任意文字。包含大小寫英文、數字以及底線_ 。等同於 [A-Za-z0-9_] |
. |
不包含換行符號的任意字元。 |
每一個字元類別都有 Inverse classes
,字元類別用大寫表示
代表要匹配除了這個字元集合以外的字元
簡寫 | 說明 |
---|---|
\D |
Non-digit: 任意字元,除了數字 0~9。 |
\S |
Non-space: 任意字元,除了\s |
\W |
Non-wordly: 任意字元,除了 \w |
應用:
// 要從字串中擷取出號碼, 僅留下數字
let str = "+7(903)-123-45-67";
// 作法 1
// 找出字串中所有數字,使用 join 組成一個字串
alert( str.match(/\d/g).join('') ); // 79031234567
// 作法 2
// 換成 \D 寫法
// 利用 replace,找出字串中不為數字的字元,並用 ""空字串取代
alert( str.replace(/\D/g, "") ); // 79031234567
除了字元類別
,也可以自己自訂集合
把字元放在 []
中,用來匹配在[]
其中任一個字元
/c[ou]t/ 等同於 /cot|cut/ or /c(o|u)t/
cot , cut 都符合
但 cout 不符合
也可以給一個要找的範圍
例如:[a-c]
--> 匹配 abc 字元[0-4]
--> 匹配 01234
利用^
表示集合以外(補集合/餘集合的概念)
和 \d
\D
用法類似
例如:[^aeyo]
: 除了 a,e,y,o 的任意字元[^0-9]
: 除了數字以外的任意字元。等同於 \D
取自 JAVASCRIPT.INFO 的範例
// 有一個這樣的正規表達式 /Java[^script]/
// 會匹配到 Java 和 JavaScript 這兩個字串 ?
alert( "Java".match(/Java[^script]/) ); --> 印出什麽 ?
alert( "JavaScript".match(/Java[^script]/) ); --> 印出什麽 ?
翻譯年糕:/Java[^script]/
--> 正規表達式
對於要測試的字串都會經過上面正規表達式進行比對
--> [^script]
代表要找到一個字元,是一個! --> 一個不為 s,c,r,i,p,t
的字元
--> Java[^script]
--> Java_
--> 要有五個連在一起的字元匹配這樣的規則
// 結果:
alert( "Java".match(/Java[^script]/) ); // null
alert( "JavaScript".match(/Java[^script]/) ); // "JavaS"
假設時間可以用 時:分
或是 時-分
兩種格式表示
需要找出字串中符合以上格式的時間
// 寫出可以找出字串中時間的 Regexp
let regexp = /your regexp/g;
alert( "Breakfast at 09:00. Dinner at 21-30".match(regexp) ); // 必須印出 09:00, 21-30
翻譯年糕:
時間規則為 --> 兩位數的小時以及兩位數的分鐘,中間以 :
或 -
符號連結
[0-9][0-9][:-][0-9][0-9]
總共五個字元
數字可以再簡化成 \d\d[:-]\d\d
因為要整個字串搜尋完,再加上 g
flag --> /\d\d[:-]\d\d/g