我有很多理解正则表达式的问题,我不确定我想做什么是可能的。
我希望正则表达式能够与任何顺序包含“a”AND“b”的字符串匹配。
示例:
rrrarrbrr
匹配
rrrbrrarar
匹配
rrrbbbrrr
不匹配
有可能在正则表达式的帮助下做到这一点吗? 提前致谢
答案 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的部分。