我們在之前的文章曾經簡單介紹過正規表達式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變數幫忙~! 挺有意思的東西!正規表達式用來處理字串貞的極端方便