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

Regex for reordered characters of a given string

我正在尝试查找与重新排序的字符串 0046711766 匹配的正则表达式。因此,正好是两个 0、两个 1、一个 4、三个 6 和两个 7,顺序不限。在搜索 Whosebug 后,我做了这个

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

这似乎很管用。但我之前没有正面前瞻的经验,可能有更有效的方法来做到这一点。据我了解,我的条件的最大限制实际上是在最后,这对于在数据库中应用这种搜索是不利的。

的确,目前最受限制的条件是在最后,但如果它在开头,您将无法使用先行断言(您需要使用后行断言)。

但是lookbehind断言需要fixed-width(有一些例外,例如在Java中),所以你不能在这里真正使用它们。

不过,您可以做一件事,那就是对主要条件使用先行断言。

这是您当前的解决方案,稍作改进 (demo):

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

这是具有额外前瞻性的版本 (demo) (edit: I made the groups inside lookaheads non-capturing):

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