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

C# 正则表达式包含多个字符串,c#,java,php,regex,expression,C#,Java,Php,Regex,Expression,我对理解正则表达式有很多问题,我不确定我想做的是可能的 我想要一个正则表达式能够与包含任意顺序的“a”和“b”的字符串匹配 例如: rrrarrbrr 匹配 匹配 不匹配 有没有可能在正则表达式的帮助下做到这一点? 提前感谢您可以使用此模式: a.*b|b.*a 如 或者简单地说: bool containsAandB = input.Contains("a") && input.Contains("b"); 如果您处理大量输入,并且只想在字符串上迭代一次,那么一点Linq

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

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

例如:

rrrarrbrr
匹配

匹配

不匹配

有没有可能在正则表达式的帮助下做到这一点?
提前感谢

您可以使用此模式:

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;

虽然p.s.w.g的答案肯定是正确的,但它实际上并没有推广到两个以上的字符(你必须包括字符顺序的所有可能排列)。通常,要对输入进行多个断言,我们使用lookaheads:

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

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


我强烈建议您阅读以了解正则表达式的最新情况。他们看起来确实比实际情况更令人畏惧。它也有一个部分(或者更确切地说是两个部分)。

是的,不需要仅仅因为问题涉及字符串就使用正则表达式。@MichaelMyers嗯,没有正则表达式的版本确实会在字符串中迭代两次而不是一次。不确定在这种情况下正则表达式是否会更快,不过…@nolonarlinq在这种情况下会有所帮助。看到我更新的答案,这应该是最快的解决方案。+1好技巧,我必须记住这一点。虽然它似乎只适合比赛测试。如何使用它来捕获字符串的
a…b
部分?(不是OP问题的一部分,我只是好奇)@p.s.w.g如果您的环境支持它,您可以捕获
a
b
(以及捕获者在字符串中的位置)并手动提取子字符串。
bool containsAandB = input.Contains("a") && input.Contains("b");
bool containsAandB = input.Where(c => c == 'a' || c == 'b')
                          .Distinct().Take(2).Count() == 2;
^(?=.*a)(?=.*b)