正则表达式,用于给定字符串的重新排序字符

时间:2018-11-06 07:30:36

标签: regex swap substitution regex-lookarounds

我正在尝试找到与正则表达式匹配的重新排序字符串0046711766。因此,正好以任意顺序排列两个0,两个1,一个4,三个6和两个7。搜索StackOverflow之后,我做了

(?=([^0]*0){2}) (?=([^1]*1){2}) (?=([^6]*6){3}) (?=([^7]*7){2}) (?=.*4) [01467]{10}

这似乎很有效。但是我之前没有积极的前瞻性经验,也许有更有效的方法可以做到这一点。据我了解,对我的条件的最大限制实际上是在最后,这对在数据库中进行这种搜索不利。

1 个答案:

答案 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}