0

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

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

例子 :

rrrarrbrr

匹配

rrrbrrarar

匹配

rrrbbbrrr

不匹配

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

4

2 回答 2

6

您可以使用此模式:

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;
于 2013-06-19T15:09:11.100 回答
5

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

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

^将表达式锚定到字符串的开头。这更多是一种优化,对理解有一点帮助(如果条件在字符串的开头不能匹配,则不需要在后面的位置再次检查)。然后,前瞻检查字符串下方(?=...)是否存在某个位置。a但是先行实际上并没有提前字符串中的位置(它只是向前看),所以我们仍然在字符串的开头,现在可以检查另一个条件(b字符串下面的某个地方)。这样,您可以轻松添加多个条件,而无需考虑它们在字符串中的位置。

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

我强烈建议您阅读本教程,以帮助您快速了解正则表达式。他们看起来真的比实际上更令人生畏。它还有一个部分(或者说是两个)专门针对lookarounds

于 2013-06-19T15:12:56.683 回答