首页 > 解决方案 > 给定字符串的重新排序字符的正则表达式

问题描述

我试图找到一个匹配重新排序的字符串的正则表达式0046711766。所以,正好有两个 0、两个 1、一个 4、三个 6 和两个 7,顺序不限。在搜索 StackOverflow 之后,我做了这个

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

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

标签: regexswapsubstitutionregex-lookarounds

解决方案


确实,最大的限制条件当前位于末尾,但如果它位于开头,您将无法使用前瞻断言(您需要后向断言)。

但是后向断言需要是固定宽度的(有一些例外,例如在 Java 中),所以你不能在这里真正使用它们。

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

因此,这是您当前的解决方案,稍有改进(演示):

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

这是带有额外前瞻(演示)的版本(编辑:我使前瞻内的组不捕获):

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

推荐阅读