Javascript初學筆記25 正規表達式 in JS (match,test,replace)

我們在之前的文章曾經簡單介紹過正規表達式Regrex,是一種非常方便處理字串的工具,今天則在JS上試試一些用法,先做個正規表達式的簡單複習。

^字串開頭必須符合某個條件 // ^09 便會符合09開頭的字串
$字串結尾必須符合某個條件 // 555$便會符合555結尾的字串
?字元出現一次或零次
+字元出現一次以上
*字元出現複數次或零次
{x,y}指定字元出現介於x~y次,若單獨使用就是只限定上限或下限
[ ]匹配[ ]內的語法 // [abc] 會匹配具有abc的字元,注意 是只要包含a或b或c都匹配
[^ ]若沒有[^ ]內的字元則匹配
d/D匹配所有數字/非數字
w/W匹配所有數字、字元以及底線/匹配所有非數字、字元以及底線
.匹配所有字元

複習完後我們就可以直接開始了,JS內有兩種正規表達式的建立方法

let regrex = /正規表達式/
let regrew =  new  RegExp("正規表達式")

兩種都可以配合等等要講解的三種方法使用。根據目前我的理解,兩者個差別在於前者用於pattern不會變動時,而後者用於pattern會動態變動時,也因此前者在效能方面表現較為出色,暫時我先用前者做示範。

pattern.test(要測試的字元)

test會檢視測試的字元是否符合pattern的格式並回傳一個布林值,如下

let regrex = /^09\d{8}$/
console.log(regrex.test('0933458123')) //true 符合手機號碼格式 
console.log(regrex.test('04-26541475')) //false  

pattern.match(要尋找的字元的索引數)

match則會檢視測試的字元並回傳一個陣列,如下

let text_mes = "Hi,I'm Danny . It's very nice meeting you." 
console.log(text_mes.match('a'))
[ 'a',
   index: 8,
   input: 'Hi,I\'m Danny . It\'s very nice meeting you.',
   groups: undefined ]

pattern.replace(要取代的字元,取代用的字元)

replace稍微複雜一些些,要取代的字元可以用正規表達式來寫,用來尋找字串中符合pattern的字元做取代,而取代用的字元可以單純的使用某字串或是帶入一個函數,首先先看一下最基礎的用法。

let regrex_test = /\d/ 只尋找數字
console.log('Danny123Denny'.replace(regrex_test,'*'))
//Danny*23Denny

從上面的例子應該可以看出一個很嚴重的問題,replace僅會處理第一個符合條件的字元,但若是我想將這個方法應用在之前做過的姓名加密的的話,就需要一點點小幫助!

g繼續往下,直到跑完整個字串
i不分大小寫
let regrex_test = /\d/g 只尋找數字
console.log('Danny123Denny'.replace(regrex_test,'*'))
//Danny***Denny

如何?這樣就可以簡單的完成加密,連函式都不用寫!
最後來看一下如何使用函式帶入replace中,基本語法如下

function replacer(match, p1, p2, p3, offset, string) {
   
   return 你想要的結果;
 }
console.log(要處理的字串.replace(pattern,replacer))

看一下上方的既用變數,p1~p3表示pattern中的分組,match表示符合條件的字元,offset表示匹配到的字元與原字元的偏移量(假設目標匹配bc,而原字元是’abcd’ 則偏移量為1,暫時我也不知道這能幹嘛),string則表示我們所用的原字串。了解這個規則後就可以看看以下的實作。

function upper (match){
     return match.toUpperCase()
 }
 console.log('danny123'.replace(/[a-z]/g,upper))
//DANNY123 

以上的例子沒有經過分組,所以不需要p變數幫忙~! 挺有意思的東西!正規表達式用來處理字串貞的極端方便

發表留言