iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
自我挑戰組

寫程式帶給我的無形快樂系列 第 17

吃下 Regular Expressions 翻譯年糕 (字元類別)

  • 分享至 

  • xImage
  •  

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 的範例

1. 匹配與否

// 有一個這樣的正規表達式 /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"

2. 找出規則

假設時間可以用 時:分 或是 時-分 兩種格式表示
需要找出字串中符合以上格式的時間

// 寫出可以找出字串中時間的  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


上一篇
吃下 Regular Expressions 翻譯年糕 (前言)
下一篇
吃下 Regular Expressions 翻譯年糕 (量詞)
系列文
寫程式帶給我的無形快樂30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言