提高遊戲陪玩app開發水準,熟練掌握正規表示式

雲豹科技程式設計師發表於2021-11-26
很多人對正規表示式又愛又恨, 愛的是網上有很多別人寫好的正規表示式可以拿到遊戲陪玩app開發中直接使用簡化工作程式碼, 恨的是一旦正則匹配的需求調整苦於看不懂別人寫好的正規表示式不知道在遊戲陪玩app開發時如何修改。

1. 首先看看正則優點

需求: 將‘ab c d e’字串中的空格去掉
不使用正則:
// 將字串 -> 通過空格轉為陣列 -> 在變為字串
let str = 'ab c d e';
let strToArr = str.split(' ');
let ArrToStr = strToArr.join('');
使用正則:
// 直接匹配出空格替換為空串
let str = 'ab c d e';
let res = str.replace(/\s/g, '');
從上面對資料的處理我們可以看出正則的優勢:
1、方便, 只需要一行程式碼就可以解決遊戲陪玩app開發中問題; 2、高效, 在原有的資料型別上進行處理而無需改變資料型別;
但是也正則也有自己的缺點:
對遊戲陪玩app開發初學者不友好, 可能看不懂\s g代表著什麼第一眼看上去很麻煩, 但是隨著對正則的掌握越來越熟練後這個缺點也不復存在了, 只要瞭解了它的規則就可以以很少的程式碼寫出js中複雜的匹配規則, 下面來學習一下正則中的基本規則吧!

2. 正則基本規則

1. 兩種形式
一種是例項化形式, 一種是字面量形式. 一般在遊戲陪玩app開發時都是使用字面量形式去宣告一個正則, 例項化形式一般都是在遊戲陪玩app開發中匹配內容是一個變數的情況下才使用, 這個後期會有說明可以先不看.
// 1. 建構函式例項化形式
let reg = new RegExp('test', 'g');
let str = 'this is test';
reg.test(str);
// 2. 直接字面量形式
let reg = /test/g
let str = 'this is test'
str.test(reg)
2. 以 /test/g 為例說明這個正則含義
這個表示式可以分兩段進行理解:
1、/test/ 兩個斜槓中的test代表我要匹配的內容中是否包含test這個字串 2、/test/後面的g字母代表著匹配的範圍, 此時代表著匹配全域性,其實很好理解g就是英文global的縮寫
明白了上面兩段我們就可以很好的看出這個正則的作用了: 全域性匹配一個字元看裡面是否至少含有一個test的字串
let reg = /test/g
// 1. 字串中不包含test情況
'tes'.match(reg) -> null
// 2. 字串包含且只有一個test情況
'test is a'.match(reg) -> ['test']
// 3. 字串包含且有多個test的情況
'test is a test'.match(reg) -> ['test', 'test']
我們發現多個test都會被匹配出來, 此時就是因為g操作了匹配的範圍進行了全域性匹配,如果我們去掉g,則只會匹配出前面的test
let reg = /test/;
'test is a test'.match(reg) -> ['test'] (當然整體的值是['test', index: 0, input: 'test is a test', groups: undefined], 這個後面會詳細解釋, 這裡只需要看出只匹配出一個test結果就好)
由此可見正則最後面的字母代表著遊戲陪玩app開發中的匹配條件, 除了g全域性匹配以外還有其他的例如, i忽略大小寫, m匹配多行
// 沒有i的情況下對大小寫敏感, 無法匹配出字串中的test
let reg = /TEST/g;
console.log('test is a test'.match(reg)); // null
// i 意思是忽略大小寫
let reg = /TEST/gi;
console.log('test is a test'.match(reg));  // ['test', 'test']
// m 多行匹配 修飾符的作用 現在把Test開頭的字串匹配出來
let str = 'Test is a test.\nTest is here'
let reg = /^Test/g  -> 只能匹配到第一個Test, 不能匹配換行後的Test
let reg = /^Test/gm -> 多行匹配\n後為第二行的Test也能匹配出來
3. [] 括號表示式理解
在上面的例子中我們可以看出, /test/匹配成功的關鍵點是字串中必須有完整的’test’, 如果少一個t (‘tes’) 也不會匹配成功, 如果我們想在遊戲陪玩app開發中一位一位的匹配那麼就需要使用[]表示式了, 比如我有一個需求匹配一個字串中包含’abc’或者包含’bbc’這兩種情況都能成立,那麼寫法就是:
// [ab] -> 意思代表開頭的這一位可以是a也可以是b
let reg = /[ab]bc/g
在遊戲陪玩app開發中遇到[]時候不用慌, 可以簡單理解為有幾個括號就是匹配幾位, 例如:
// 現在匹配三個字元, 第一位是w或者x, 第二位x或者y, 第三位z
let reg = /[wx][xy][z]/g
4. 正則預設的匹配規則
正則中有兩個很重要的點
1、預設貪婪模式, 能匹配多個就不會匹配少 2、匹配過了的就不會在重新匹配
舉個例子:
// 貪婪模式的效果: 匹配字串a連續出現一次或者多次
let reg = /a+/g;
let str = 'this a dog or aa god or aaa good';
str.match(reg); ->  ['a', 'aa', 'aaa']
從上面的結果上能發現結果並不是 [a, a, a, a, a, a]. 簡單的說明一下匹配規則:
1、首先從左往右開始匹配,匹配到了第一個a發現只有一個同時符合要求並且把這個a記錄了下來; 2、從第一個a繼續往後開始匹配發現or後面有兩個連續的aa也符合的正則的匹配條件,並且預設是貪婪模式則將aa這個值也記錄了下來; 3、然後從aa後面繼續往後查詢發現aaa也匹配了出來. 4、直到匹配最後,結果也就是[‘a’, ‘aa’, ‘aaa’]

3. 結尾

本篇主要簡單講解了一下在遊戲陪玩app開發中正則的基礎用法和基礎規則, 其實裡面還有很多知識點例如如何使用正則進行復雜規則的匹配、實現模板字串的替換、()表示式的使用以及重難點字串的replace方法和正規表示式的搭配使用等等。當然這些知識需要在瞭解完所有正則的基礎後才能去學習。
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理 原文連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2844337/,如需轉載,請註明出處,否則將追究法律責任。

相關文章