iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
0
  • 表示式var pattern = new RegExp(s$) or var pattern =/s$/ 代表著以s結尾的字串都匹配。

  • 透過 \ (backslash) 開頭來表示轉義序列

字元 匹配
\0 NUL字元
\t tab
\n new line
\v vertical tab
\uxxx 16進制unicode字元
\cX 控制字元
  • ^ $ . * + ? = ! : | \ / ( ) [ ] { } 都具有特殊意義

  • 需要用到標點符號的時候可以前面加 \。

字元

把個別的字元放在中誇號內,一個中括號僅驗證匹配一個字元。
/[abc]/: 匹配a、b、c任一個字母即可。
/[^abc]/: 表示a、b、c以外的任何字元,^為否定字元。
/[a-c]/: 表示匹配a、b、c任一個字母即可,-為連號字元。
/[a-zA-Z0-9]/: 表示任何字母數字都匹配。
/[\s\d]/: 表示任何空白字元數字。

字元 匹配
[...] 中括號內任一字元
[^...] 中括號內字元之外的字元
. 除了newline or其他unicode行終止符號之外的任何字元
\w 等同[a-zA-Z0-9],任何字母數字
\W 等同[^a-zA-Z0-9],ASCII任何字元之外
\s 任何unicode空白字元
\S 任何unicode空白字元之外的字元,與 \W不同
\d 等同[0-9],任何數字
\D 等同[^0-9],任何數字之外的字元
[\b] 一個字面上的倒退字元

重複

可以使用/\d\d/代表兩位數字。但無法敘述。
/\d{2,4}/: 表示匹配2~4個數字。
/\w{3}\d?: 表示匹配三個文字然後接一個0~9的數字或不接任何東西(表示數字可有可無)。
/\s+javascript\s+/: 表示匹配javascript前後都接一個或多個空白字元。
/[^(]*/: 表示匹配不為左括號0個或多個字元。

字元 匹配
{n,m} 匹配前一個項目重複至少n次且不多於m次
{n,} 匹配前一個項目重複至少n次或更多
{n} 匹配前一個項目重複符合n次
? 等同於{0,1},匹配前一個項目出現1次或0次(表示前一個項目非必須)
+ 等同{1,},,匹配前一個項目出現1次或多次
* 等同{0,},,匹配前一個項目出現0次或多次

擇一匹配 分組 參考

/ab|12|AB/: 匹配ab或12或AB任一個字串即可。
/(ab|12)+|xy/: (ab或12字串出現過至少一次)或xy字串。
(\d+)([a-z])\1: 至少一個的數字後面接a~z的字母然後最後面跟第一個分組一樣(至少一個的數字)。
/['"][^'"]*\1/ : 引號要前後符合。

字元 匹配
| 擇一匹配,先匹配左邊若不匹配,則匹配右邊
(...) 分組,將項目組成一個單元,使可套用* + ? |,記住分組可當作後面的參考
(?:...) 將項目組成一個單元,但不記住匹配分組字元
\n 匹配編號為第n個分組,但(?:不計入分組

指定匹配特定位置

/^Jackson$/: 表示匹配J開頭n結尾,中間接ackso字串。
/\bJackson\b/: 表示匹配Jackson字串。

\sApple\s: 取得Apple的單字,但此方式會有兩個問題

  • 無法取得開頭或結尾Apple的字串,因為前後沒有空白
  • 取回來得字串前後也都會有空白。

解決的分式透過\b,/\bApple\b/

/([Aa]pple)?(?=\:)/: 取得Apple or apple且後面接:的字串,若字串為Apple: is a fruit,匹配的字串會是Apple,若字串為Apple is a fruit,不會有任何匹配。

字元 匹配
^ 匹配字串開頭,在多行時,代表每一行的開頭
$ 匹配字串結尾,在多行時,代表每一行的結尾
\b 匹配文字邊界,(與[\b]用法不同)
\B 匹配不是文字邊界的位置
(?=p) 要求後面的字元必須匹配p(回傳時不包含p字元)
(?!p) 要求後面的字元不匹配p

旗標

/javascript$/im: 字串javascriptjavascript\nis fun都匹配。
/\bjavascript\b/i: 不區分大小寫javascript的比對。
/\bjavascript\b/gi: 不區分大小寫javascript的比對且找出所有出現的地方。

字元 匹配
i 不區分大小寫比對
g 執行全域比對
m 多行模式,^比對每行或字串開頭,$比對每行或字串結尾

比對用的字串方法

  • search(x): 回傳第一個匹配的字串字首的索引(若找不到回傳-1)
    若引數不為RegExp,則會先傳給RegExp建構式,轉成正規表示式。search()不支援g旗標。
var str="javascript";
str.search('/script/i'); // return 4 
  • replace(r,str): 收尋並取代
    第一個引數RegExp(若不為RegExp並不會像search自動將引數轉為RegExp,會直接用輸入的字串比對),第二引數置換的字串
var str="javascript javascript";

var regExp= /javascript/ // 不能寫成var regExp= "/javascript/"
// 僅會置換第一個匹配的字串
str.replace(regExp,'JavaScript') // return "JavaScript javascript"


var regExp_g = /javascript/gi;
// 所有javascript都替換成JavaScript
str.replace(regExp_g,'JavaScript') // return "JavaScript JavaScript"


var regExp_q = /(java)(script)/g
// $1:紀錄()第一組的字串當置換字串
str.replace(regExp_g,'"$1"') // return ""java" "java""
  • match: 尋找匹配的結果,並回傳結果陣列
    僅輸入一個引數,引數接受RegExp,若引數不為RegExp,則會先傳給RegExp建構式,轉成正規表示式
var str= '1 plus 2 equals 3'

var regExp_g = /\d+/g
str.match(regExp_g); // return ["1", "2", "3"] 


// 沒有g旗標時
var regExp = /\d+/
str.match(regExp); 
// return ["1", index: 0, input: "1 plus 2 equals 3", groups: undefined]

  • split
var str = '1, 2, 3, 4, 5';
str.split(/s*,s*/); //return ["1","2","3","4","5"]

上一篇
Day 11: 類別與模組(Part 2)
下一篇
Day 13: 子集與擴充
系列文
Javascript 犀牛本-濃縮再濃縮 提煉再提煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言