regex - 正则表达式以未定义的顺序匹配给定数量的字符
问题描述
我正在寻找与以下内容匹配的正则表达式:字符“a”的 2 倍和字符“b”的 3 倍。此外,字符不必是后续字符,这意味着不仅应允许“aabbb”和“bbaaa”,还应允许“abbabb”、“abbab”等。
听起来这应该是一件容易的事,但是 atm 我就是无法绕开它。重定向到一个好的阅读是赞赏。
解决方案
您需要使用积极的前瞻性。这与此处描述的密码验证问题相同。
编辑:
正向查找将允许您根据字符串检查模式,而无需更改正则表达式的下一部分匹配的位置。这意味着您可以在字符串的当前位置测试多个正则表达式模式,并且要使正则表达式匹配所有正则前瞻必须匹配。
在您的情况下,您正在寻找 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,所以我们将整个字符串与 匹配.*$
。
推荐阅读
- django - django ManyToManyField 唯一
- haskell - 如何在 Haskell 中实现这个功能?
- java - Firestore 减少读取
- javascript - 循环对象并设置值的递归函数,使用嵌套属性数组连接对象
- reactjs - 如何在锚标记内输出项目值
- linux-kernel - Buildroot 构建系统错误
- android - 为子 Compose 禁用嵌套滚动
- oop - 如何设计一个复杂的图形用户界面,同时使用构建器设计模式和抽象设计模式?
- python - Django 未识别 URL 模式
- bash - 如何在不发送变量值的情况下从另一个脚本在脚本中写入变量?