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

问题描述:

我对理解正则表达式有很多问题,我不确定我想要做什么是可能的。正则表达式包含多个字符串

我想要一个正则表达式能够以任何顺序与包含“a”和“b”的字符串匹配。

例子:

rrrarrbrr 

比赛

rrrbrrarar 

比赛

rrrbbbrrr 

这么想的比赛

是否有可能做到这一点与正则表达式的帮助? 在此先感谢

+2

http://www.regular-expressions.info/tutorial.html –

虽然p.s.w.g的答案肯定是正确的,但它并没有真正推广到两个以上的字符(你必须包含字符顺序的每个可能的排列)。通常情况下,使上输入多断言,我们使用向前看符号:

^(?=.*a)(?=.*b) 

^锚表达对字符串的开头。这更像是一种优化,稍微有助于理解(如果条件不能在字符串的开始处匹配,则不需要在稍后的位置再次检查它们)。然后向前看(?=...)检查在字符串的某处有一个a。但是前瞻并没有真正提前在字符串中的位置(它只有看起来提前),所以我们仍然在字符串的开始处,现在可以检查另一个条件(在字符串的某处存在b) 。通过这种方式,您可以轻松添加多个条件,而不必考虑字符串在哪里实现。

当然,由于p.s.w.g.也表示,对于单个角色而言,根本不需要使用正则表达式,但如果您想一次检查多个更复杂的模式,则此技术可能非常有用。

我强烈建议您阅读this tutorial以使您了解正则表达式。他们真的看起来比实际上更令人畏惧。它也有一个部分(或更确切的说是两个)on lookarounds

+0

+1好戏,我得记住这个。尽管它似乎只适用于测试比赛。这怎么能用来捕捉字符串的'a ... b'部分? (不是OP的问题的一部分,我只是好奇) –

+0

@ p.s.w.g如果你的环境支持它,你可以捕获'a'和'b'(以及捕获在字符串中的位置)并手动提取子字符串。 –

您可以使用此模式:

a.*b|b.*a 

正如

bool containsAandB = Regex.IsMatch(input, "a.*b|b.*a"); 

或者简单:如果你处理大投入

bool containsAandB = input.Contains("a") && input.Contains("b"); 

,你想迭代在字符串只有一次,一点Linq可以帮助:

bool containsAandB = input.Where(c => c == 'a' || c == 'b') 
          .Distinct().Take(2).Count() == 2; 
+2

是的,没必要仅仅因为问题涉及字符串而使用正则表达式。 –

+0

@MichaelMyers那么,正则表达式的版本遍历字符串两次而不是一次。不知道这个例子中的正则表达式会更快,但是... – Nolonar

+0

@Nolonar Linq在这种情况下可以提供帮助。看到我更新的答案,*应*是最快的解决方案。 –