一、jsmatchall的基本用法
jsmatchall是JS正則表達式中的全局匹配函數。在常見的字符串處理、模板解析、數據抽取等場景中,它非常有用。其基本語法如下:
let results = str.matchAll(regexp);
其中,regexp表示正則表達式,而str則表示字符串。這個方法返回一個迭代器,可以用來遍歷字符串中滿足正則表達式要求的所有匹配結果:
let str = "123456789"; let regexp = /\d{3}/g; let results = str.matchAll(regexp); for (let match of results) { console.log(match[0]); // 123, 456, 789 }
上面的例子中,正則表達式\d{3}表示匹配三個連續的數字。由於設置了全局匹配標誌g,因此matchAll函數返回的迭代器會迭代出所有匹配的結果。
除了遍歷,matchAll還可以將匹配結果轉換為數組的形式。只需要使用Array.from方法即可:
let str = "123456789"; let regexp = /\d{3}/g; let results = Array.from(str.matchAll(regexp)); console.log(results); // [[123], [456], [789]]
二、使用groups屬性訪問匹配結果
除了返回匹配到的字符串,正則表達式還經常需要捕獲其中的一些內容。JS中可以使用捕獲組來完成這個任務。在matchAll函數中,可以使用groups屬性訪問每個捕獲組:
let str = "2022-01-28"; let regexp = /(\d{4})-(\d{2})-(\d{2})/; let results = Array.from(str.matchAll(regexp)); for (let match of results) { let year = match.groups.year; let month = match.groups.month; let day = match.groups.day; console.log(year, month, day); // 2022 01 28 }
上面的例子中,正則表達式使用了三個捕獲組,分別對應年月日。而在結果中,每個match對象都有一個groups屬性可以訪問到這些組的值。
三、使用lookahead和lookbehind
JS的正則表達式除了普通的匹配和捕獲,還提供了lookahead和lookbehind這兩種特殊的斷言形式。它們可以讓正則表達式只匹配某些特定的位置,而不是具體的字符。
示例代碼如下:
let str = "CAFE BAZ"; let regexp = /(?<=CAFE\s)(.+?)(?=\sBAZ)/; let match = Array.from(str.matchAll(regexp))[0]; console.log(match.groups[0]); // "BAZ"
正則表達式/(?<=CAFE\s)(.+?)(?=\sBAZ)/表示匹配距離’CAFE ‘後、’ BAZ’前的內容。其中,?<=語法表示positive lookbehind,該斷言表示匹配前面是指定的文本(這裡是’CAFE ‘),但不包括這個文本在內。?=語法表示positive lookahead,該斷言表示匹配後面是指定的文本(這裡是’ BAZ’),但不包括這個文本在內。
四、使用$&和$1引用匹配結果
在正則表達式中,$&表示匹配到的整個字符串,而$1、$2等則表示匹配到的第1、2個捕獲組。這兩個特殊的符號,在matchAll函數中也可以使用:
let str = "Hello world, my name is John"; let regexp = /Hello\s(\w+)/g; let results = Array.from(str.matchAll(regexp)); for (let match of results) { let newText = match[0].toUpperCase() + ', ' + $1.toLowerCase() + '!'; console.log(newText); // "HELLO WORLD, my!" }
上面的例子中,正則表達式匹配到了一些以’Hello ‘為開頭的單詞,並且將這些單詞轉換為了全大寫,後面加上了一個感嘆號。在替換字符串的過程中,使用$1引用了第一個捕獲組。
五、使用flags屬性獲取正則表達式的標誌
除了查詢匹配結果,matchAll函數還可以查詢使用的正則表達式的標誌。使用flags屬性即可:
let str = "123,456,789"; let regexp = /\d{3}/g; let results = Array.from(str.matchAll(regexp)); console.log(regexp.flags); // "g"
上面的例子中,正則表達式使用了全局匹配標誌g。在獲取匹配結果之前,可以使用flags屬性獲取這個標誌。
六、總結
由於全局匹配函數matchAll可以同時返回多個匹配結果,因此特別適用於需要對大量文本數據快速進行處理的場景。除了上述的一些特性之外,matchAll還擁有很多其他的方法來滿足不同的需求。在實踐中,開發者可以靈活配合使用這些方法,從而實現更加高效的文本處理。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/257725.html