【问题标题】:Regex contain multiple string正则表达式包含多个字符串
【发布时间】:2013-06-19 15:07:03
【问题描述】:

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

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

例子:

rrrarrbrr

匹配

rrrbrrarar

匹配

rrrbbbrrr

不匹配

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

【问题讨论】:

标签: c# java php regex expression


【解决方案1】:

你可以使用这个模式:

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;

【讨论】:

  • 是的,不需要因为问题涉及字符串就使用正则表达式。
  • @MichaelMyers 好吧,无正则表达式的版本确实会遍历字符串两次而不是一次。不确定在这种情况下正则表达式是否会更快,但......
  • @Nolonar Linq 在这种情况下可以提供帮助。查看我更新的答案,应该是最快的解决方案。
【解决方案2】:

虽然 p.s.w.g 的回答肯定是正确的,但它并不能真正概括为两个以上的字符(您必须包括字符顺序的所有可能排列)。通常,为了对输入进行多个断言,我们使用前瞻:

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

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

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

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

【讨论】:

  • +1 好技巧,我必须记住这一点。虽然它似乎只适用于测试比赛。如何使用它来捕获字符串的a...b 部分? (不是OP问题的一部分,我只是好奇)
  • @p.s.w.g 如果您的环境支持,您可以同时捕获ab(以及捕获在字符串中的位置)并手动提取子字符串。
猜你喜欢
  • 2011-06-27
  • 2011-07-22
  • 1970-01-01
  • 2012-05-11
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
相关资源
最近更新 更多