我在理解正则表达式方面有很多问题,我不确定我想要做什么是可能的。
我想要一个能够以任何顺序与包含“a”和“b”的字符串匹配的正则表达式。
例子 :
rrrarrbrr
匹配
rrrbrrarar
匹配
rrrbbbrrr
不匹配
是否可以在正则表达式的帮助下做到这一点?提前致谢
我在理解正则表达式方面有很多问题,我不确定我想要做什么是可能的。
我想要一个能够以任何顺序与包含“a”和“b”的字符串匹配的正则表达式。
例子 :
rrrarrbrr
匹配
rrrbrrarar
匹配
rrrbbbrrr
不匹配
是否可以在正则表达式的帮助下做到这一点?提前致谢
您可以使用此模式:
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;
虽然 pswg 的答案肯定是正确的,但它并没有真正推广到两个以上的字符(您必须包括字符顺序的所有可能排列)。通常,要对输入进行多个断言,我们使用前瞻:
^(?=.*a)(?=.*b)
^
将表达式锚定到字符串的开头。这更多是一种优化,对理解有一点帮助(如果条件在字符串的开头不能匹配,则不需要在后面的位置再次检查)。然后,前瞻检查字符串下方(?=...)
是否存在某个位置。a
但是先行实际上并没有提前字符串中的位置(它只是向前看),所以我们仍然在字符串的开头,现在可以检查另一个条件(b
字符串下面的某个地方)。这样,您可以轻松添加多个条件,而无需考虑它们在字符串中的位置。
当然,正如 pswg 所说,对于单个字符,根本不需要使用正则表达式,但如果您想一次性检查多个更复杂的模式,这种技术会很有用。
我强烈建议您阅读本教程,以帮助您快速了解正则表达式。他们看起来真的比实际上更令人生畏。它还有一个部分(或者说是两个)专门针对lookarounds。