我正在使用java正则表达式,但我想这些原则适用于每个正则表达式.

我对正则表达式应匹配的段有以下要求:

  • 至少有3次"a"
  • 至少有3次"b"
  • "a"和"b"的出现顺序可以是任意的

this post的启发,我想出了以下正则表达式(regex101):

(?=([b]*[a]){3})(?=([a]*[b]){3})[ab]+

我正在努力添加一项新要求:

  • 如果没有或至少有3个"c",则匹配
  • 如上所述,"c"可以出现在段中的任何位置

有效序列示例:

aaabbb
ababab
aaabbbccc
abcabcabc
ababcabcc

无效序列示例(整体):

aaabbbc
aabbb
abbccc
abcabca

我目前的 idea :

  • 至少有3个"c"

    (?=([bc]*[a]){3})(?=([ac]*[b]){3})(?=([ab]*[c]){3,})[abc]+

  • 以一种粗略的方式将此溶液和上述溶液结合起来(regex101),基本上只是一个大的"无或至少3"

    ((?=([bc]*[a]){3})(?=([ac]*[b]){3})(?=([ab]*[c]){3,})[abc]+|(?=([b]*[a]){3})(?=([a]*[b]){3})[ab]+)

最后,Question:有没有更好的方法可以使用其他方法来实现这一点,比如"c"-需求前瞻、嵌套前瞻或完全不同的方法?

推荐答案

您可以使用

(?<![abc])              # No "a", "b", "c" allowed immediately on the left
(?=(?:[bc]*a){3})       # At least three "a"s
(?=(?:[ac]*b){3})       # At least three "b"s
(?:                     # Either
   (?=[ab]*(?![abc]))   #  only "a" or "b"s allowed until a location not followed with "a", "b" or "c"
 |                      #  or
   (?=(?:[ab]*c){3})    # At least three "c"s
)
[abc]+                  # Match and consume one or more "a", "b" or "c" chars

请参见regex demo.

作为单行:

(?<![abc])(?=(?:[bc]*a){3})(?=(?:[ac]*b){3})(?:(?=[ab]*(?![abc]))|(?=(?:[ab]*c){3}))[abc]+

Java相关问答推荐

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

基于仅存在于父级中的字段查询子文档?

找到允许的最大底片

同时运行JUnit测试和Selenium/Cucumber测试时出现问题

H2弹簧靴试验跌落台

路径映射未发生

如何让JFileChooser(DIRECTORIES_ONLY)从FolderName中的空白开始?

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

JPanel透支重叠的JComcoBox

如何使用Jackson将XML元素与值和属性一起封装

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

如何集成语义发布和BitBucket(Java项目)

如何使用路径过渡方法使 node 绕圆旋转?

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

如何调整JButton的大小以适应图标?

为什么创建Java动态代理需要接口参数

如何制作回文程序?

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

如何使用带有可选参数的类生成器?

错误:JOIN/ON的参数必须是boolean类型,而不是bigint类型.Java Spring启动应用程序