pol*_*mon 2 regex optimization
这个想法是在一个任意长度的字符串中只允许四个'a'实例和两个'b'实例.
现在,其他角色并不重要,我所关心的只有四个'a'和两个'b'.我想出的就是:
m{
^[^ab]*
(
(b[^ab]*b[^ab]*a[^ab]*a[^ab]*a[^ab]*a)|
(b[^ab]*a[^ab]*b[^ab]*a[^ab]*a[^ab]*a)|
(b[^ab]*a[^ab]*a[^ab]*b[^ab]*a[^ab]*a)|
(b[^ab]*a[^ab]*a[^ab]*a[^ab]*b[^ab]*a)|
(b[^ab]*a[^ab]*a[^ab]*a[^ab]*a[^ab]*b)|
(a[^ab]*b[^ab]*b[^ab]*a[^ab]*a[^ab]*a)|
(a[^ab]*b[^ab]*a[^ab]*b[^ab]*a[^ab]*a)|
(a[^ab]*b[^ab]*a[^ab]*a[^ab]*b[^ab]*a)|
(a[^ab]*b[^ab]*a[^ab]*a[^ab]*a[^ab]*b)|
(a[^ab]*a[^ab]*b[^ab]*b[^ab]*a[^ab]*a)|
(a[^ab]*a[^ab]*b[^ab]*a[^ab]*b[^ab]*a)|
(a[^ab]*a[^ab]*b[^ab]*a[^ab]*a[^ab]*b)|
(a[^ab]*a[^ab]*a[^ab]*b[^ab]*b[^ab]*a)|
(a[^ab]*a[^ab]*a[^ab]*b[^ab]*a[^ab]*b)|
(a[^ab]*a[^ab]*a[^ab]*a[^ab]*b[^ab]*b)
)
[^ab]*$
}x;
Run Code Online (Sandbox Code Playgroud)
(一如既往,这是Perl正则表达式)
除了仅使用附加括号重新组合案例之外,还有更好的解决方案吗?在正则表达式中,对已接受的案例进行置换似乎有点"错误".
在不同的借口下,在stackoverflow上询问了这个问题.那个问题当时被删除了,因为写得不好,没有尝试解决问题,而且很明显,这是TCS课程的作业.无论如何,我尝试回答这个问题,并提出了一条消息,该问题已被删除(同时).无论如何,手头的问题对我来说似乎很有意思,所以我决定再问一遍,但是有更好的借口.)
四个a要求:
[^a]*(?:a[^a]*){4}
Run Code Online (Sandbox Code Playgroud)
两个b要求:
[^b]*(?:b[^b]*){2}
Run Code Online (Sandbox Code Playgroud)
通过在先行中封装第一个要求来组合:
^(?=[^a]*(?:a[^a]*){4}$)[^b]*(?:b[^b]*){2}$
Run Code Online (Sandbox Code Playgroud)