正则表达式包含多个字符串

Lez*_*zme 0 php c# java regex expression

我有很多理解正则表达式的问题,我不确定我想要做什么是可能的.

我想要一个正则表达式能够匹配任何顺序包含"a"和"b"的字符串.

示例:

rrrarrbrr
Run Code Online (Sandbox Code Playgroud)

比赛

rrrbrrarar
Run Code Online (Sandbox Code Playgroud)

比赛

rrrbbbrrr
Run Code Online (Sandbox Code Playgroud)

不匹配

在正则表达式的帮助下可以做到这一点吗?提前致谢

p.s*_*w.g 6

您可以使用此模式:

a.*b|b.*a
Run Code Online (Sandbox Code Playgroud)

如在

bool containsAandB = Regex.IsMatch(input, "a.*b|b.*a");
Run Code Online (Sandbox Code Playgroud)

或者干脆:

bool containsAandB = input.Contains("a") && input.Contains("b");
Run Code Online (Sandbox Code Playgroud)

如果您处理大量输入并且只想对字符串进行一次迭代,那么Linq可以提供一些帮助:

bool containsAandB = input.Where(c => c == 'a' || c == 'b')
                          .Distinct().Take(2).Count() == 2;
Run Code Online (Sandbox Code Playgroud)

  • 是的,不需要使用正则表达式只是因为问题涉及字符串. (2认同)

Mar*_*der 5

虽然 pswg 的答案当然是正确的,但它并没有真正概括为超过两个字符(您必须包括字符顺序的所有可能的排列)。通常,要对输入进行多个断言,我们使用前瞻:

^(?=.*a)(?=.*b)
Run Code Online (Sandbox Code Playgroud)

^将表达式锚定到字符串的开头。这更多的是一种优化,稍微有助于理解(如果字符串开头的条件无法匹配,则无需在后面的位置再次检查它们)。然后,先行检查字符串下方(?=...)是否有某个位置。a但是前瞻实际上并没有提前字符串中的位置(它只是向前查找),因此我们仍然位于字符串的开头,现在可以检查另一个条件(b字符串下方有一个)。通过这种方式,您可以轻松添加多个条件,而无需考虑它们在字符串中的哪个位置得到满足。

当然,正如 pswg 还所说,对于单个字符,根本不需要使用正则表达式,但是如果您想一次性检查多个更复杂的模式,这种技术可能会很有用。

我强烈建议您阅读本教程,以帮助您快速掌握正则表达式。他们看起来确实比实际情况更令人畏惧。它还有一个(或者更确切地说是两个)专门关于lookarounds的部分。