读书笔记 -- 正则闯关记录

最近看完了正则指引,这是一本工具书,可以很系统的了解正则,恰巧又发现了RegexGolf网站,跟着做了一些题目,巩固下正则相关的基础知识,当然大部分都是参考他人的解决方案。

资料地址

https://alf.nu/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

从匹配单词来看形式如akarakaasagaradegenere等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]))+$

知乎–正则表达式如何匹配 3 的倍数?

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})+)$

参考

检查素数的正则表达式
Regex Golf闯关记录

造轮子--Dalgen-Script-IntelliJ
Spring Boot -- 自动配置原理