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

时间:2013-06-19 15:07:04

标签: c# java php regex expression

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

我希望正则表达式能够与任何顺序包含“a”AND“b”的字符串匹配。

示例:

rrrarrbrr

匹配

rrrbrrarar

匹配

rrrbbbrrr

不匹配

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

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

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

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

当然,正如p.s.w.g.还说,对于单个角色,根本不需要使用正则表达式,但如果你想一次性检查多个更复杂的模式,这种技术会很有用。

我强烈建议您阅读this tutorial,以加快正则表达式的速度。他们真的看起来比实际上更令人生畏。它还有一个(或更确切地说是两个)特别on lookarounds的部分。