C# 正则表达式包含多个字符串
我对理解正则表达式有很多问题,我不确定我想做的是可能的 我想要一个正则表达式能够与包含任意顺序的“a”和“b”的字符串匹配 例如:C# 正则表达式包含多个字符串,c#,java,php,regex,expression,C#,Java,Php,Regex,Expression,我对理解正则表达式有很多问题,我不确定我想做的是可能的 我想要一个正则表达式能够与包含任意顺序的“a”和“b”的字符串匹配 例如: rrrarrbrr 匹配 匹配 不匹配 有没有可能在正则表达式的帮助下做到这一点? 提前感谢您可以使用此模式: a.*b|b.*a 如 或者简单地说: bool containsAandB = input.Contains("a") && input.Contains("b"); 如果您处理大量输入,并且只想在字符串上迭代一次,那么一点Linq
rrrarrbrr
匹配
匹配
不匹配
有没有可能在正则表达式的帮助下做到这一点?
提前感谢您可以使用此模式:
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的答案肯定是正确的,但它实际上并没有推广到两个以上的字符(你必须包括字符顺序的所有可能排列)。通常,要对输入进行多个断言,我们使用lookaheads:
^(?=.*a)(?=.*b)
^
将表达式锚定到字符串的开头。这更像是一种优化,并略微有助于理解(如果字符串开头的条件无法匹配,则无需在以后的位置再次检查它们)。前瞻(?=…)
然后检查字符串下面是否有a
。但是向前看实际上并没有推进字符串中的位置(它只向前看),所以我们仍然在字符串的开头,现在可以检查另一个条件(字符串下面的某个地方有ab
)。通过这种方式,您可以轻松地添加多个条件,而不考虑它们在字符串中的何处得到满足
当然,正如p.s.w.g.所说,对于单个字符,根本不需要使用正则表达式,但是如果您想一次检查多个更复杂的模式,这种技术可能很有用
我强烈建议您阅读以了解正则表达式的最新情况。他们看起来确实比实际情况更令人畏惧。它也有一个部分(或者更确切地说是两个部分)。是的,不需要仅仅因为问题涉及字符串就使用正则表达式。@MichaelMyers嗯,没有正则表达式的版本确实会在字符串中迭代两次而不是一次。不确定在这种情况下正则表达式是否会更快,不过…@nolonarlinq在这种情况下会有所帮助。看到我更新的答案,这应该是最快的解决方案。+1好技巧,我必须记住这一点。虽然它似乎只适合比赛测试。如何使用它来捕获字符串的
a…b
部分?(不是OP问题的一部分,我只是好奇)@p.s.w.g如果您的环境支持它,您可以捕获a
和b
(以及捕获者在字符串中的位置)并手动提取子字符串。
bool containsAandB = input.Contains("a") && input.Contains("b");
bool containsAandB = input.Where(c => c == 'a' || c == 'b')
.Distinct().Take(2).Count() == 2;
^(?=.*a)(?=.*b)