正则表达式包含多个字符串
我对理解正则表达式有很多问题,我不确定我想要做什么是可能的。正则表达式包含多个字符串
我想要一个正则表达式能够以任何顺序与包含“a”和“b”的字符串匹配。
例子:
rrrarrbrr
比赛
rrrbrrarar
比赛
rrrbbbrrr
这么想的比赛
是否有可能做到这一点与正则表达式的帮助? 在此先感谢
虽然p.s.w.g的答案肯定是正确的,但它并没有真正推广到两个以上的字符(你必须包含字符顺序的每个可能的排列)。通常情况下,使上输入多断言,我们使用向前看符号:
^(?=.*a)(?=.*b)
^
锚表达对字符串的开头。这更像是一种优化,稍微有助于理解(如果条件不能在字符串的开始处匹配,则不需要在稍后的位置再次检查它们)。然后向前看(?=...)
检查在字符串的某处有一个a
。但是前瞻并没有真正提前在字符串中的位置(它只有看起来提前),所以我们仍然在字符串的开始处,现在可以检查另一个条件(在字符串的某处存在b
) 。通过这种方式,您可以轻松添加多个条件,而不必考虑字符串在哪里实现。
当然,由于p.s.w.g.也表示,对于单个角色而言,根本不需要使用正则表达式,但如果您想一次检查多个更复杂的模式,则此技术可能非常有用。
我强烈建议您阅读this tutorial以使您了解正则表达式。他们真的看起来比实际上更令人畏惧。它也有一个部分(或更确切的说是两个)on lookarounds。
+1好戏,我得记住这个。尽管它似乎只适用于测试比赛。这怎么能用来捕捉字符串的'a ... b'部分? (不是OP的问题的一部分,我只是好奇) –
@ 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;
是的,没必要仅仅因为问题涉及字符串而使用正则表达式。 –
@MichaelMyers那么,正则表达式的版本遍历字符串两次而不是一次。不知道这个例子中的正则表达式会更快,但是... – Nolonar
@Nolonar Linq在这种情况下可以提供帮助。看到我更新的答案,*应*是最快的解决方案。 –
http://www.regular-expressions.info/tutorial.html –