读书笔记 -- 正则闯关记录
最近看完了正则指引,这是一本工具书,可以很系统的了解正则,恰巧又发现了RegexGolf
网站,跟着做了一些题目,巩固下正则相关的基础知识,当然大部分都是参考他人的解决方案。
资料地址
思路
Warmup
热身题,直接匹配单词含有foo的即可。\w*foo\w*
Anchors
热身题,匹配以ick结尾的单词\w+ick$
It never ends
以fu结尾的词,但是不能使用$
,因此表达XX不能是XX,就想到了环视。\w*fu(?!\w)
Ranges
范围匹配,匹配组的字符都是a-f之间的构成^[a-f]+$
Backrefs
提示很明显,使用反向引用。^(\w{3})\w*\1\w*
Abba
匹配非ABBA形式单词,因此直接使用否定环视,环视中为可以匹配ABBA形式的单词。^(?!\w*(\w)(\w)\2\1)
A man, a plan
匹配词中含有 abxxxba形式的词,因此使用反向引用匹配(\w)(\w).?\2\1
,但是右侧中单词psorosperm
也能匹配进去,该题提示可以作弊,因此把p再排除掉,最终形式如下:(\w)(\w).?\2\1(?!p)
Prime
匹配素数个x,该题是反向思路,匹配是素数的,然后使用否定环视排除。素数的定义是只有1和他本身两个因子,因此(xx+?)
的意思是从2开始匹配,如果含有因子2那么必然 素数=2*N,那么\1
自然会匹配剩下的值。如果2没有匹配则尝试3.
以8为例,当xxxxxxxx
,引擎首先匹配前两个xx
,然后剩下xxxxxx
由\1
匹配,正好匹配成功,所以8不是素数。
以11为例,当xxxxxxxxxxx
,引擎首先尝试前两个xx
,然后剩下9个x
由\1
匹配,无法匹配,接着尝试先匹配xxx
,剩下8个x
由\x
匹配,无法匹配继续尝试。。。一直到最后都没法匹配,所以11是素数。^(?!^(xx+?)\1+$)
Four
从匹配单词来看形式如akaraka
,asagara
,degenere
等abcbebde形式。\w*(.)(.\1){3}\w*
Order
该题单词都按照一定字母顺序,因此可以^a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*$
这样的做法,或者作弊下使用(?!^o)^\w{5,6}$
匹配不以o开头的5-6个长度的单词。
Triples
匹配3的倍数,毫无思路。。。^([0369]|[147][0369]*[258]|([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258]))+$
Glob
^(.*)(\*?)(.*)(\*?)(.*)(\*?)(.*) .* \1((?!\2).+|\2)\3((?!\4).+|\4)\5((?!\6).+|\6)\7$
Balance
该题要求括号成双成对出现,因此必然是包裹结构,因此一直写包裹就好了。^(<(<(<(<(<(<<>>)*>)*>)*>)*>)*>)*$
Powers
该题直接根据规则写,标识符合的2的次幂x数量。^(x|((xx){1,8})|x{32}|((x{64})+))$
Long count
该题拆分为 00 01 10 11
四个元数据,然后根据这四个规则来匹配^(00)\1 \1(01) \1(10) \1(11) \2\1 \2\2 \2\3 \2\4 \3\1 \3\2 \3\3 \3\4
Alphabetical
看不懂,网上搜的结果。。。( .+[ts]..)\1|(tat|r). r|a t|e .r
Powers 2
和Long count
所采取的方式一致。^(x|(x{3}){1,729}|(x{6561})+)$
参考
- 版权声明: 感谢您的阅读,本文由屈定's Blog版权所有。如若转载,请注明出处。
- 文章标题: 读书笔记 -- 正则闯关记录
- 文章链接: https://mrdear.cn/posts/readnote-regex.html