Regex Golf 闯关解析

1,293 阅读1分钟

这是一个正则闯关网站:Regex Golf

网站有17个测试题目,每道题都分为左(需要匹配)和右(不需要匹配)列表,找到两边列表的每项的规律,然后在输入框填入符合匹配规则的正则表达式。

1. Plain strings

左边都有 foo

  • foo

2. Anchors

左边都是以 k 结尾

  • k$

3. It never ends – $ not allowed

左边都是以 fu 结尾,但不允许有 $。字符集 \b 匹配一个单词边界

  • u\b

4. Ranges

组成左边所有单词的字母都是在范围 a-f

  • ^[a-f]+$

5. Backrefs

左边前三个字母会重复出现

  • (...).*\1

6. Abba

右边每个单词中有四个字母是回文。正向否定预查

  • ^(?!.*(.)(.)\2\1)

7. A man, a plan

左边的每个单词都是一个回文,题目要求不超过13个字符

  • ^(.)[^p].*\1$

8. Prime

左边的长度是素数。对右边的合数进行正向否定预查

  • ^(?!^x?$|^(xx+?)\1+$)

9. Four

同一个字母隔着某个字符连续出现

  • (.)(.\1){3}

10. Order

①:左边列表的长度为 5 或 6 ,为6时最后一个字母不是 e

  • ^.{5}[^e]?$

②:左边列表的长度为 5 或 6 ,并且排除掉以 o 开头。三种写法

  • ^[^o].{4,5}$ | ^[^o].....?$ | ^[^o]?.{5}$

11. Triples

①:左边的项都是 3 的倍数

  • ^([0369]|[147][0369]*[258]|([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258]))+$

②:不按规律来,写出每个数

  • (00[039]|12|015|50)$|1..?4|4.2|1.7|6.0|006

12. Glob

两边每一项都是 XXXXXX matches XXXXXXXXXX。区别就在于左边的 * 代表了 1 个或以上的字符,而右边的 * 代表了 0 个或以上的字符

  • ^((\w*)( .+ \2$|*(\w*)( .+ \2.+\4$|*.* .+ \2.+\4.)))

13. Balance

左边的括号成对

  • ^(<(<(<(<(<(<<>>)*>)*>)*>)*>)*>)*$

14. Powers

左边的项是 2 的幂次长度

  • ^(x|((xx){1,8})|x{32}|((x{64})+))$

15. Long count

8 个数为一对,每对的各前三位数都是一样的,每对的第一组数的最后一位一直是 0 。

  • ^((.+)0 \2+1 ?)*$

    • 答案详解:(.+) 捕获组匹配每对的前三位数,(.+)0 匹配前四位;\2 获取第二个捕获组 (.+) 的值,\2+1 匹配后四位。

16. Alphabetical

左边的项是所有按字典序排好的一串单词

  • ( .+[ts]..)\1|(tat|r). r|a t|e .r

17. Powers 2

左边的项是 3 的幂次长度

  • ^(x{81})+$|^x$|^(x{3}){1,9}$