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)
不匹配
在正则表达式的帮助下可以做到这一点吗?提前致谢
您可以使用此模式:
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)
虽然 pswg 的答案当然是正确的,但它并没有真正概括为超过两个字符(您必须包括字符顺序的所有可能的排列)。通常,要对输入进行多个断言,我们使用前瞻:
^(?=.*a)(?=.*b)
Run Code Online (Sandbox Code Playgroud)
^将表达式锚定到字符串的开头。这更多的是一种优化,稍微有助于理解(如果字符串开头的条件无法匹配,则无需在后面的位置再次检查它们)。然后,先行检查字符串下方(?=...)是否有某个位置。a但是前瞻实际上并没有提前字符串中的位置(它只是向前查找),因此我们仍然位于字符串的开头,现在可以检查另一个条件(b字符串下方有一个)。通过这种方式,您可以轻松添加多个条件,而无需考虑它们在字符串中的哪个位置得到满足。
当然,正如 pswg 还所说,对于单个字符,根本不需要使用正则表达式,但是如果您想一次性检查多个更复杂的模式,这种技术可能会很有用。
我强烈建议您阅读本教程,以帮助您快速掌握正则表达式。他们看起来确实比实际情况更令人畏惧。它还有一个(或者更确切地说是两个)专门关于lookarounds的部分。