背景

https://leetcode.cn/problems/subdomain-visit-count/

需求如下:从网址字符串中获取各个级别的域名,如:从"abc.cde.f.com"中生成["abc.cde.f.com","cde.f.com","f.com","com"]

过程

其实首先想到是,正则是否能做到?琢磨了一会没想到,用split后再拼接的方法做完了。

然而并不甘心,于是继续琢磨如何用正则解决此问题。

最关键的一点是:如何在不消耗字符串的情况下捕获匹配结果

在stackoverflow找到了以下答案

https://stackoverflow.com/questions/5616822/how-to-use-regex-to-find-all-overlapping-matches

https://stackoverflow.com/questions/71406121/regex-is-there-a-way-to-not-consume-words-that-are-captured

简言之,只需要在表达式最外层用 (?=) 包裹一下就可以了。想要获取的部分用()作为捕获组来获取。

例1

由"12345"生成["12345","2345","345","45","5"]

(?=(\d+))

console.log(
  [..."12345".matchAll(/(?=(\d+))/g)]
    .map(groups=>groups[1])
)
// => Array(5) [ "12345", "2345", "345", "45", "5" ]

例2

获取"123456789123456789"中每10个相邻的数字

(?=(\d{10}))

console.log(
  [..."123456789123456789".matchAll(/(?=(\d{10}))/g)]
    .map(groups=>groups[1])
)
// => Array(9) [ "1234567891", "2345678912", "3456789123", "4567891234", "5678912345", "6789123456", "7891234567", "8912345678", "9123456789" ]

例3

获取"foo.bar.blog.mofengfeng.com"中各个级别的域名

可以以匹配 [.](.+)的方式来获取各级域名,但不包含最底级域名(整个字符串),因为前面没有[.]。

解决方法:字符串前面加一个[.]再匹配,或用 ^.*$ 额外匹配一下整个字符串。

console.log(
  [...("."+"foo.bar.blog.mofengfeng.com").matchAll(/(?=([.](.+)))/g)]
    .map(groups=>groups[2])
)
// => Array(5) [ "foo.bar.blog.mofengfeng.com", "bar.blog.mofengfeng.com", "blog.mofengfeng.com", "mofengfeng.com", "com" ]


I am a noob