【发布时间】:2013-06-19 15:07:03
【问题描述】:
我在理解正则表达式方面有很多问题,我不确定我想要做什么是可能的。
我想要一个正则表达式能够以任意顺序匹配包含“a”和“b”的字符串。
例子:
rrrarrbrr
匹配
rrrbrrarar
匹配
rrrbbbrrr
不匹配
是否可以在正则表达式的帮助下做到这一点? 提前致谢
【问题讨论】:
标签: c# java php regex expression
我在理解正则表达式方面有很多问题,我不确定我想要做什么是可能的。
我想要一个正则表达式能够以任意顺序匹配包含“a”和“b”的字符串。
例子:
rrrarrbrr
匹配
rrrbrrarar
匹配
rrrbbbrrr
不匹配
是否可以在正则表达式的帮助下做到这一点? 提前致谢
【问题讨论】:
标签: c# java php regex expression
你可以使用这个模式:
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;
【讨论】:
虽然 p.s.w.g 的回答肯定是正确的,但它并不能真正概括为两个以上的字符(您必须包括字符顺序的所有可能排列)。通常,为了对输入进行多个断言,我们使用前瞻:
^(?=.*a)(?=.*b)
^ 将表达式锚定到字符串的开头。这更像是一种优化,对理解有一点帮助(如果条件不能匹配到字符串的开头,则不需要在后面的位置再次检查)。前瞻(?=...) 然后检查字符串下方是否有a。但是前瞻实际上并没有推进字符串中的位置(它只是向前看),所以我们仍然在字符串的开头,现在可以检查另一个条件(有一个@ 987654327@ 在字符串的某处)。这样,您可以轻松添加多个条件,而无需考虑它们在字符串中的位置。
当然,正如 p.s.w.g.还说,对于单个字符,根本不需要使用正则表达式,但如果您想一次性检查多个更复杂的模式,这种技术会很有用。
我强烈建议您阅读this tutorial 以帮助您快速了解正则表达式。他们看起来真的比实际上更令人生畏。它还有一个部分(或者更确切地说是两个),特别是 on lookarounds。
【讨论】:
a...b 部分? (不是OP问题的一部分,我只是好奇)
a 和b(以及捕获在字符串中的位置)并手动提取子字符串。