正則表達式應用

上一篇文章跟大家介紹了正則表達式的一些常見知識點和相關例子,那這篇文章我就來分享一下自己在工作當中所遇到的跟正則表達式有關的運用案例,看看它在我的工作中發揮了怎樣的作用。

應用場景

正則表達式的應用場景有很多,一般是用來驗證字符串,提取字符串和替換字符串。

  1. 給一個字符串,把字符串裏面的鏈接、數字、電話等顯示不同的顏色;
  2. 給一個包含自定義表情的文字,找出裏面的表情,替換成本地的表情圖片;或者一個字符串進行替換
  3. 根據用戶的輸入內容,判斷是否是微信號、手機號、郵箱、純數字等

我在工作當中遇到的例子有好幾個,貼出來讓大家參考一下:

例1:將銀行卡號的倒數第四位之前的四個數字變成*

解析

銀行卡的位數實際是不固定的,如果按照字符串替換的方式的話,就要對銀行卡的位數進行判斷,然後再進行替換,需要做多次if-else判斷,這樣代碼實際上是非常臃腫難看的。

所以我們嘗試着用正則表達式來解決一下。

先來看銀行卡的規律,銀行卡數字在15~19之間,第一個數字不能是0,在這裏我們要對倒數第4位前面的4位數進行替換,必然要使用到分組。按照正則裏面分組的知識點,分組從左到右依次是組1,組2,組3,依次類推,比如組1,可以用1或者$1來表示。

來看具體代碼:

let reg8 = /^([1-9]{1}\d{6,10})\d{4}(\d{4})$/
let str8a = '370248145284512' //15
let str8b = '3702481452845125' //16
let str8c = '3702481452845125832' //19
console.log('---------銀行卡號-----------')
console.log(str8a.replace(reg8,`$1****$2`)) // 3702481****4512
console.log(str8b.replace(reg8,`$1****$2`)) // 37024814****5125
console.log(str8c.replace(reg8,`$1****$2`)) // 37024814528****5832

例二: 判斷文本當中的年月日

解析

時間的判斷是非常常見的,上一篇文章當中我們講述捕獲分組和非捕獲分組時聊到了時間的判斷,現在我們來看看簡化版的時間的判斷。

小時是0-23小時,分和秒都是0-59,根據它們的規律我們可以使用分組和修飾符來找到全文的時間。

具體代碼:

let reg = /((2[0-3])|([0-1]\d))(:[0-5]\d){2}/g
let str = '現在的時間是12:23:44,下一刻應該是12:55:22,但絕不是24:13:34'
console.log(str.match(reg)) // ["12:23:44", "12:55:22"]

例3: 對選中部分數字進行篩選

選出8**0,9**0,同時不包含8200, 8310, 8520, 8440, 8320, 8100, 8920, 8800, 8180, 8010, 8480, 8150

解析

這個是同事的一個需求,開始我的想法是寫兩個正則表達式,一個將8**0,9**0的數字選出來,一個將不包含的數字選出來,然後從前面的數字當中剔除掉後面的那些數字。

兩個正則表達式爲:

re1 = /[8-9]\\d{2}0/g

reg2 = /8(200|310|520|440|320|100|920|800|180|010|480|150)/g

但是同事告訴我只能用一個表達式做出來,那麼就要使用到之前所說的零寬度反向預查了。已知第一個數字後面一定不爲200,那麼使用零寬度反向預查來進行篩選。

let str9 = '8200, 8310, 8520, 8440, 8320, 8100, 8920, 8800, 8180, 8010, 8480, 8150, 3434,545656,8544,6554,8900,9330,9120,8333,8200,9200'
let reg9 = /(8(?!(200|310|520|440|320|100|920|800|180|010|480|150))\d{2}0)|(9\d{2}0)/g
console.log(str9.match(reg9)) // ["8900", "9330", "9120", "9200"]

這個表達式第一個數字是8或者9,分別進行判斷,8後面一定不爲題目要求的數字,零寬度反向預查和\b一樣雖然會限定匹配內容,但實際上是不會匹配到任何內容的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章