Regex Golf通关记录(3)——基础篇下

Regex Golf网址:https://alf.nu/RegexGolf

Regex Golf通关解答:Regex Golf通关解答-优快云博客

与上一篇不同,本篇的题目都有一些语法限制,解起来稍微麻烦点。

It never ends–$ not allowed

这一题跟Anchors一题几乎一模一样,匹配以“fu”结尾的单词,但是不可以使用结尾符“$”。这其实考验的是我们对正则表达式中元字符的了解程度。在正则表达式中,可以使用元字符“\b”来匹配一个单词的边界。所以本题的答案为:u\b。

qntm–Match any string except BB, without using any zero-width assertions

匹配除bb以外的所有字符串,如果可以使用零宽断言的话,答案应该是:^(?!bb$)。但是本题不允许使用零宽断言,那就只有老老实实构造了。

(1)当字符串长度不为2时,必然不匹配“bb”;可以使用 ^.?$ 来匹配长度为0或1的串,...+ 来匹配长度大于2的串;

(2)当字符串长度为2时,b[^b]|[^b]b|[^b][^b] 为合法的模式,可进一步简化为 .[^b]|[^b].;

所以本题的答案为:^.?$|.[^b]|[^b].|...+。可以进一步简化为:^.?$|.?[^b].?|...+。当然,如果只匹配用例的话,可得字符最少的答案:a|c|^.?$。

Welcome back–To celebrate the reopening, solve this level without using (?!).

观察可知,这一题是让我们匹配不包含“oo”的文本串,同样不允许我们使用零宽断言。不允许出现连续的字符“o”,意味着要么没有“o”,要么每个“o”的前后都会有一个或多个非“o”字符,于是可以构造出本题的答案:^(o?[^o])*o?$,共13个字符。看排名,本题还存在一个12字符的答案,我暂时没解出来。

Equal–... but no backreferences allowed.

Equal这一题让我们匹配一个合法的二进制等式,如果可以利用反向引用会非常容易:^(.+)=\1,但题目并不允许。数字相等意味着每一位数字字符都相等,即每个数字字符在间隔16个字符以后,必然会再次出现。也就是说,在等式中,不允许存在某个数字字符在间隔16个字符以后,出现了不同字符的情况,这样我们就把它转换成了一个零宽断言的匹配描述。由于只有1和0两种字符,所以很容易构造出答案:^(?!.*1.{16}0)(?!.*0.{16}1)。从这个答案我们也可以发现正则表达式编写的一个小技巧,由于零宽断言不消耗字符,所以可以对一个位置进行多次断言,从而达到逻辑与的效果。本题字符最少答案为:^(?!.*1.{16}0)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值