我正在尝试找到与正则表达式匹配的重新排序字符串0046711766
。因此,正好以任意顺序排列两个0,两个1,一个4,三个6和两个7。搜索StackOverflow之后,我做了
(?=([^0]*0){2}) (?=([^1]*1){2}) (?=([^6]*6){3}) (?=([^7]*7){2}) (?=.*4) [01467]{10}
这似乎很有效。但是我之前没有积极的前瞻性经验,也许有更有效的方法可以做到这一点。据我了解,对我的条件的最大限制实际上是在最后,这对在数据库中进行这种搜索不利。
答案 0 :(得分:1)
没错,目前限制最大的条件是在结尾处,但是如果是在开始处,则您将无法使用先行断言(而是需要先行断言)。
但是后置断言必须为fixed-width(有一些例外,例如在Java中),因此您不能在这里真正使用它们。
但是,您可以做一件事,那就是对主要条件使用先行断言。
这是您当前的解决方案,并进行了一些小的改进(demo):
(?=([^0]*0){2})(?=([^1]*1){2})(?=[^4]*4)(?=([^6]*6){3})(?=([^7]*7){2})[01467]{10}
这是具有额外前瞻(demo)的版本(编辑:我在前瞻non-capturing中进行了分组:
(?=[01467]{10})(?=(?:[^0]*0){2})(?=(?:[^1]*1){2})(?=[^4]*4)(?=(?:[^6]*6){3})(?=(?:[^7]*7){2}).{10}