iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
Modern Web

想轉職的鯊魚從零基礎開始學習JavaScript系列 第 26

想轉職的鯊魚從零基礎開始學習JavaScript Day-26 RegExp 正規運算式 (一)

  • 分享至 

  • xImage
  •  

概述

RegExp 正規運算式 全名是 regular expression
是電腦科學的一個概念。正規表示式使用單個字串來描述、符合一系列符合某個句法規則的字串。在很多文字編輯器裡,正則表達式通常被用來檢索、替換那些符合某個模式的文字。
除了自身的方法(exec和test)中,還常在String字串的 match、replace、search、split等方法中被運用。

建立一個RegExp - Literal notation and constructor

正規表達式有兩個建立方式,分別是Literal notation(文字表示法)及constructor(建構子函式)

  • Literal notation(文字表示法)

將pattern(樣式)放在兩個"/"斜線中間

const shark = /ab+c/flag;
//字串"ab+c"為pattern,放在兩個"/"的中間
  • constructor(建構子函式)

RegExp 正規運算式,是一個物件,而且是一個有constructor的物件,所以可以用new的方式來建立一個RegExp 正規運算式,而建立的方式又依參數的使用分為兩類,string pattern跟regular expression

const sharkA = new RegExp('ab+c',flag)
// string pattern 用字串當參數
const sharkA = new RegExp(/ab+c/,flag)
// regular expression 用RegExp當參數
  • 補充 flag(旗標)

    flag(旗標)的位置是放在最後一個"/"的後面,或是constructor的第二個參數,目前JavaScript支援的flag(旗標)有三個。

    1. "i" case-insensitive:不區分大小寫。
    2. "g" global:全域式,將所有符合匹配條件的都找出來(不然原本只會匹配一個)
    3. "m" multiline mode:多行模式,除了開頭與結尾,換行的開頭跟結尾也納入匹配的對象。

special characters 特殊字符

首先,下面這些標點符號,在正規表達是中有特別的意義
^ $ . * + ? = ! : | \ / ( ) [ ] { }
經過這些標點符號的組合可以製造出不同的意義的RegExp,可區分下面幾類

  • Character classes 字符類別
    用來區分字母及數字及規範相關符號
    \d 匹配任何數字
    \D 匹配數字以外的字元
    \w 匹配任何英文字母及數字
    \W 匹配任何英文字母及數字以外的字元
    \s 匹配任何Unicode的空白字元
    \S 匹配任何Unicode的空白字元以外的字元
    \ 轉譯,+一個字母會變成另一個意思
    . 以這結尾的字符 .+字母,匹配以這個字母結尾的詞彙
    \n 匹配換行符號
    | 匹配"|"符號前後兩個字元其一,就像是or

  • Assertions 斷言
    將單字拆開來做匹配
    ^ 匹配輸入開頭,EX:^字母A,輸入開頭的必須是字母A
    $ 匹配輸入的結束,EX:$字母A,輸入結尾的必須是字母A
    \b 匹配一個詞彙的邊界,用來找尋符合條件的開頭或是結尾,EX:\bmo,詞彙的開頭必須是mo,或是on\b,詞彙的結尾是on。
    \B 匹配非一個詞彙的邊界,EX:\Bmo,有mo詞彙的但是不能在開頭,或是on\B,有on詞彙的但是不能在結尾。

    • Other assertions 其他斷言"?"
      x(?=y) Lookahead assertion 先行斷言
      匹配 後面有詞彙y的詞彙x,詞彙x在前y在後
      x(?!y) Negative lookahead assertion 先行否定斷言
      匹配 後面沒有詞彙y的詞彙x
      (?<=y)x Lookbehind assertion 後行斷言
      匹配 前面有詞彙y的詞彙x,詞彙y在前x在後
      (?<!y)x Negative lookbehind assertion 後行否定斷言
      匹配 前面沒有詞彙y的詞彙x
  • Groups and backreferences
    (x) Capturing group捕獲組,匹配出符合內容的詞彙並將其內容製成群組輸出。
    (?x) Named capturing group,跟上面類似,只是會透過Name儲存匹配到的內容,並透過.groups.Name取出。
    (?:x) Non-capturing group :語法相對於 capturing group,表示僅需要用作 group 的用途,但不需要製成群組。
    \n n是一個正整數,這是一個反向的引用,\n的前面通常是一個詞彙B,匹配條件是:詞彙B的後面n個字母
    \k 要跟(?x)配合使用,使用k之前必須要有一個(?x),表示跟(?x)匹配出的值一樣。

  • Quantifiers (量詞)
    表示要匹配的字符或表達式的數量
    x* 匹配x出現0次或是多次
    x+ 匹配x出現1次獲是多次
    x? 匹配x出現0或是0次,表示x非必需的時候
    x{n} 匹配x剛好重複n次
    x{n,} 匹配x重複n次以上
    x{n,m} 匹配x重複n次以上,但是不超過m次
    上面的匹配方式被稱作"greedy"貪婪的,會盡可能找出符合匹配的值,所以通常會在後面加一個?讓他變成"non-greedy"非貪婪的,讓她找到一個匹配項目就結束。

  • Unicode property escapes
    前一陣子有提到,javaScript會透過Unicode進行轉碼,所以匹配的方式也有透過Unicode進行匹配,可以製作出除了文字符號之外更多的匹配條件。

  • 補充[] 跟 ^
    [...] 匹配[]內的任何字元
    [^...] 匹配除了[]內以外的任何字元

資料來源

JavaScript大全-第六版
MDN-RegExp
Wiki-Regular expression
Regex 正規表示法 - 群組與環顧 (Groups & Lookaround)


上一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-25 Classes 類別(二)
下一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-27 RegExp 正規運算式 (二)
系列文
想轉職的鯊魚從零基礎開始學習JavaScript31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言