正则表达式将字符串与z的相同数量匹配,而b与y的

时间:2016-11-15 15:40:38

标签: regex

我目前正在编写一本关于正则表达式的书,其中一个练习问题是写一个正则表达式,它匹配的字符串与z的相同,而b的字符与y相同。到目前为止,我想出了以下正则表达式。

^(?=[^az]*([az][^az]*[az][^az]*)*$)(?=[^by]*([by][^by]*[by][^by]*)*$).*$

这个问题是,当a和z是偶数且b和y是偶数时它会错误地匹配(即azzz匹配,但z比s更多)。有没有办法修改我的正则表达式以正确匹配,还是我采用了错误的方法?

1 个答案:

答案 0 :(得分:1)

使用一些正则表达式引擎,您可以使用预定义的subroutines来(笨拙地)define context-free grammars,尽管语法因引擎而异,并且不是标准化的。观察(仍然不完整,但到达那里):

(?(DEFINE)
    (?'all'(?&az)|(?&by)|(?&abzy)|(?&bayz))
    (?'az'a(?&all)*z|z(?&all)*a)
    (?'by'b(?&all)*y|y(?&all)*b)
    (?'abzy'
        a(?&all)*b(?&all)*z(?&all)*y|
        a(?&all)*y(?&all)*z(?&all)*b|
        z(?&all)*b(?&all)*a(?&all)*y|
        z(?&all)*y(?&all)*a(?&all)*b
    )
    (?'bayz'
        b(?&all)*a(?&all)*y(?&all)*z|
        b(?&all)*z(?&all)*y(?&all)*a|
        y(?&all)*a(?&all)*b(?&all)*z|
        y(?&all)*z(?&all)*b(?&all)*a
    )
)

^(?&all)+$

Demo on Regex101

这样做是定义一组子模式并递归应用它们。在实际的“模式”中使用^$锚点可确保整个字符串与它们匹配。简单本身。

但是,如果你真的在生产环境中做过类似的事情,有人会在找到它时开枪射击你。