Regex Golf网址:https://alf.nu/RegexGolf
Regex Golf通关解答:Regex Golf通关解答-优快云博客
本篇的几个题目都是来匹配满足某种顺序的文本串的。
Order–Cheat.
题目的提示非常明显,稍微观察一下就可以发现,待匹配的每个单词都是按字母表的顺序排列的。因为解题用了太多次的零宽断言,有点走火入魔,我的第一反应是排除所有的逆序情况,即排除[b-z]a,[c-z][ab]……z[a-y]这些错误的情况。我开始的答案为:^(?!.*([b-z]a|[c-z][a-b]|[d-z][a-c]|[e-z][a-d]|[f-z][a-e]|[g-z][a-f]|[h-z][a-g]|[i-z][a-h]|[j-z][a-i]|[k-z][a-j]|[l-z][a-k]|[m-z][a-l]|[n-z][a-m]|[o-z][a-n]|[p-z][a-o]|[q-z][a-p]|[r-z][a-q]|[s-z][a-r]|[t-z][a-s]|[u-z][a-t]|[v-z][a-u]|[w-z][a-v]|[x-z][a-w]|[y-z][a-x]))。
这个答案太长了。后来发现,不用零宽断言,也是可以构造出一个正确答案的:^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*$。
当然,题目的提示为“Cheat”。都明说可以作弊,也就没有必要做完全匹配了。最少字符的答案为:^.{5}[^e]?$。
Alphabetical–To save typing the input will only use the characters a/e/n/r/s/t, even in hard mode.
在上一道题使用零宽断言来否定错误情况是显得有点不够简洁,但是这个思路在这道题中就刚刚好了。按字母表顺序排序的单词,第一个不同的字母不能逆序。而且题目说了所有单词都只包含aenrst这六个字符,于是我们可以得到第一版答案:^(?!(.{7})*((\S*)[e-t]\S* \3a|(\S*)[n-t]\S* \4[ae]|(\S*)[rst]\S* \5[aen]|(\S*)[st]\S* \6[a-r]|(\S*)[t]\S* \7[a-s]))。按照这个思路,如果只匹配用例中的文本的话,我最终优化出的答案为:^(?!.* (.*)(t.* \1[es]|s.* \1[nr]|r.* \1[en])),46个字符。
最后我们来欣赏一下我能找到的字符最少的答案:.r.{32}r|a.{10}te|n.n..,23个字符。老实说,我是无论如何也想不出这样的答案的。而看网站排名,居然还存在一个22字符的答案……
Long count–
按顺序匹配从0到15的二进制串。这道题正确用例只有一个,所以直接用:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111来匹配肯定不会出错,就是太长了点。我的思路是,既然这个串里已经包含了1-15中所有数字,那么你修改任何一位,都必然导致摸个数字会重复出现,于是得到答案:^(?!.*(\d{4}).*\1),18个字符。后来看到别人利用前后两个数字前三个字符相同,最后一个字符01交替的规律,写出了17个字符的答案:^((.+)0 \2+1 ?)*$。而最少14字符的答案,目前毫无思路。