复利的反正则表达式


9

Koronkorko是芬兰的复利一词。我们不希望对字符串产生复合兴趣,因此让我们找到最短的正则表达式以排除它。

给定仅由大写字母字符AZ组成的字符串,如果不包含substring,则确定与该字符串匹配的最短正则表达式KORONKORKO。包含KORONKORKO为子字符串的任何字符串都不应与正则表达式匹配。

只有字符A- ,Z[]-^?*+|()应在表达式中使用。

我认为可以使用表达式中的118个字符来完成此操作。你能把它缩短吗?

注意:此挑战来自Ohjelmointiputka(芬兰语)。


如果!是允许的字符,则可以完成^((?!KORONKORO).)*$19个字节。
Mama Fun Roll'March

3
@MamaFunRoll我认为这就是为什么 !不允许这样做。
Alex A.

我很乐于尝试在芬兰站点上工作,并且我相信您所寻找的是理论上的正则表达式,该表达式匹配/拒绝输入字符串。例如,该站点似乎仅允许使用-and ^内部字符类(因此^不能用作锚点),并且仅当整个字符串与regex匹配时(即,隐式周围^$,如反对正常的“正则表达式”,后者会将字符串视为匹配的正则表达式,如果该字符串的任何部分均与正则表达式匹配)
Sp3000,2013年

因此,我删除了PCRE答案,尽管它甚至在PHP中也可以使用,但在这种情况下几乎绝对是意料之外的。
Sp3000 '16

我忘了说,该站点通过PHP的ereg函数检查表达式是否有效。有人在ohjelmointiputka.net/keskustelu/…
访客

Answers:


6

204个字符

(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?[^KO]|[^KR])|[^KO])|[^K])|[^KN])|[^KO])|[^KR])|[^KO])|[^K])*(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?)?)?)?)?)?)?)?)?

通过转换.*KORONKORKO.*成有限状态机,反转有限状态机并将其变回正则表达式生成。


为什么这成为最佳答案?
巴林特

1

Python,77 79 97 118字节

编辑3: 重写。使用嵌套先行

^([^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^O]|O(?=$|[^N]|N(?=$|[^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^K]|K(?=$|[^O]))))))))))*$

正则表达式101

编辑2:已添加“ $ |” 整个正则表达式。现在,如果已匹配KORONKORKO的前缀,则下一个要匹配的项是字符串结尾,以前缀结尾的字符,或者是扩展前缀的字符(如果后面跟有以前缀结尾的东西)。

此正则表达式可与一起使用re.fullmatch(),该功能已在Python 3.4中添加。要与一起使用re.match()^并且$需要分别将其添加到模式的开头和结尾以获得2个字节。

([^K]|K($|[^O]|O($|[^R]|R($|[^O]|O($|[^N]|N($|[^K]|K($|[^O]|O($|[^R]|R($|[^K]|K($|[^O]))))))))))*

Regex101链接

先前的错误解决方案(请参阅评论):

K|([^K]|K([^O]|O([^R]|R([^O]|O([^N]|N([^K]|K([^O]|O([^R]|R([^K]|K[^O])))))))))*

编辑:添加了单个K


2
我不相信这会匹配K
orlp

@orip-很好。固定。
RootTwo

最新更新现在无法进行KKORONKORKO
Sp3000 '16

它可以修复吗?有任何想法吗?
RootTwo

1
不需要开始^和结束$。此外,=$是不允许的。
LegionMammal978 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.