首页 > 解决方案 > 正则表达式以未定义的顺序匹配给定数量的字符

问题描述

我正在寻找与以下内容匹配的正则表达式:字符“a”的 2 倍和字符“b”的 3 倍。此外,字符不必是后续字符,这意味着不仅应允许“aabbb”和“bbaaa”,还应允许“abbabb”、“abbab”等。

听起来这应该是一件容易的事,但是 atm 我就是无法绕开它。重定向到一个好的阅读是赞赏。

标签: regexregex-group

解决方案


您需要使用积极的前瞻性。这与此处描述的密码验证问题相同。

编辑:

正向查找将允许您根据字符串检查模式,而无需更改正则表达式的下一部分匹配的位置。这意味着您可以在字符串的当前位置测试多个正则表达式模式,并且要使正则表达式匹配所有正则前瞻必须匹配。

在您的情况下,您正在寻找 2 a' 和 3 b's,因此正则表达式与字符串中任何位置的 2 a's 完全匹配/^[^a]*a[^a]*a[^a]*$/,对于 3 b's,/^[^b]*b[^b]*b[^b]*b[^b]*$/我们现在需要将它们组合起来,以便我们可以将两者匹配在一起,如下所示/^(?=[^a]*a[^a]*a[^a]*$)(?=[^b]*b[^b]*b[^b]*b[^b]*$).*$/。这将从带有锚点的字符串的开头开始^,然后查找正好 2 个 a,然后是字符串的结尾。然后因为这是一个积极的前瞻,(?= ... )模式的下一部分在字符串中匹配的位置不会移动,所以我们仍然在字符串的开头,现在正好匹配 3 个 b。由于这是一个积极的前瞻,我们仍​​然在字符串的开头,但现在知道我们在字符串中有 2 个 a 和 3'b,所以我们将整个字符串与 匹配.*$


推荐阅读