起因是字元串比對
給定一個id,和字元串s,找到和s[id]相等,并且距離id最近的下标
那麼我們直接matchAll找,按說正常寫法是這樣的……(僅比對)
非常坑…… 牛客、賽碼平台上都是沒有matchAll的。match有
String.prototype.matchAll() is part of the ECMAScript 2020 specification (draft). In TypeScript you can include these library features by adding <code>es2020</code> or <code>es2020.string</code>, in the compiler options:
Checking the ts signature for the String and RegExp classes I realized there is no signature for matchAll. One manner to solve it could be:
(1) 原始寫法
var a='baaa'.matchAll('a');
let all_array_2=[...a];
console.log(all_array_2[0].index);
其實也可可以歸結為一句話
var a=[...'baaa'.matchAll('a')][0].index;
(2) 修改後
簡單的matchAll後傳回一個Object [RegExp String Iterator] {} 這個就解構,用數組就行
需要把matchAll部分修改成 str['matchAll'] (regExp) 實際上就是str.改成了str['']
var matches=[...'baaa'['matchAll']('a')];
console.log(matches);
(3)我們不是‘aaaa’ 這樣的字元串,而是變量名怎麼做呢
直接重新定義正則
cmp=‘a’
var e=new RegExp(cmp,"g")
str.matchAll(e)
(4)那麼想要快速找到下标,不用這個怎麼做呢
match加了g 下标裡也沒有(實際上傳‘a’的話是會隐式的調用正則去轉換的)(match隻比對一次會給index,多次就不會了
indexof有限制問題隻會比對一次,但是可以for循環繼續往下找。
var b = s.indexOf("."); //傳回值為1,即第一個字元.的下标位置
var e = s.indexOf(".", b + 1); //傳回值為11,即第二個字元.的下标位置
(5)重點來看exec:
如果沒有設定全局項 <code>/g</code>,該方法将始終傳回第一個比對項:
當全局比對時,該方法每次傳回一個比對項,直到沒有比對項時傳回 <code>null</code>:
簡單,直接多弄幾次,看傳回值就可以了!!!!!
(6)exec、test(測有無)、match(一or多但沒資訊)、search(隻會一次)、replace(替換)
(7)總體來看,好像exec這種比較主流。。
var x = "a.xxx.com b.xxx.com c.xxx.com";
希望得到 ["a","b","c"] 這三個結果
1. 正則需要 添加 g
2.exec 循環,直到傳回空
代碼如下,會輸出 a b c
var re = /\s?(.*?).xxx.com/g;
while( tempR = re.exec(x)){
console.log(tempR[1]);
}
參考文檔:http://www.w3school.com.cn/jsref/jsref_exec_regexp.asp
exec的功能比 match 強大
提示:請注意,無論 RegExpObject 是否是全局模式,exec() 都會把完整的細節添加到它傳回的數組中。這就是 exec() 與 String.match() 的不同之處,後者在全局模式下傳回的資訊要少得多。是以我們可以這麼說,在循環中反複地調用 exec() 方法是唯一一種獲得全局模式的完整模式比對資訊的方法(其實還有matchall但是這個是後來才出的)。
matchAll必須設定成g,傳回值:一個疊代器,可以使用for…of…,數組新增的擴充符(…)或Array.from()實作功能