背景
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
简言之,只需要在表达式最外层用 (?=) 包裹一下就可以了。想要获取的部分用()作为捕获组来获取。
例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" ]
Comments | 1 条评论
博主 匿名
(=・ω・=)