regex - 正则表达式匹配 a 与 z 和 b 与 y 的数量相同的字符串

标签 regex

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

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

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

最佳答案

对于某些正则表达式引擎,您可以使用预定义的 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

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

但是,如果你真的在生产环境中做这样的事情,有人很可能会在发现它时向你开枪。

关于regex - 正则表达式匹配 a 与 z 和 b 与 y 的数量相同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613941/

相关文章:

Java正则表达式仅当星号是最后一个字符时才匹配

regex - R strsplit : Split based on character except when a specific character follows

mysql - 在 MySQL 中使用 REGEXP 在逗号分隔列表中查找特定数字

javascript - 改进用于解析 YouTube/Vimeo URL 的正则表达式

Python 正则表达式 sub 单个字符

mysql如何在没有函数的情况下识别纯数字和混合数字/字母?

ruby - 正则表达式匹配子字符串并返回特定分隔符之间的字符串

python - HTML 标签中内容的正则表达式模式

java - 在引号外用逗号分割

php - preg_match_all 只匹配一个