正则表达式包含所有可选部件,但至少需要一个部件

时间:2010-05-10 14:09:04

标签: .net regex

我需要编写一个匹配字符串的正则表达式,如“abc”,“ab”,“ac”,“bc”,“a”,“b”,“c”。订单很重要,不应该匹配同一部件的多个外观。

一个?B 4 C?几乎可以解决问题。除了它也匹配空字符串。有没有办法阻止它匹配空字符串或者可能采用不同的方式为任务编写正则表达式。

4 个答案:

答案 0 :(得分:5)

^(?=.)a?b?c?$

这将检查是否至少有一个字符具有前瞻,并且与您的正则表达式匹配。

答案 1 :(得分:2)

要使用纯正则表达式执行此操作,您必须将其扩展为所有可能性:

ab?c?|a?bc?|a?b?c

如果你有预测,你可以确保字符串是非空的。或者,您可以在将字符串传递给表达式之前验证字符串的长度是否至少为1,具体取决于您选择的语言。

例如,.NET前瞻可能如下所示:

^(?=[abc])a?b?c?$

或者您可以在匹配之前测试字符串的长度:

if (YourString.Length == 1) {
   // matching code goes here, using the expression a?b?c?
}

答案 2 :(得分:0)

你可以记下所有的排列(这是一种痛苦)或者没有遗漏哪些字母的可能性(ab?c?|a?bc?|a?b?c),这有点不那么痛苦。

答案 3 :(得分:0)

尝试将您遇到的所有问题的所有功能都打包到一个正则表达式中毫无意义。最好的解决方案是编写明显的正则表达式,并添加一个零长度检查。在绝对必要的情况下,你应该只使用regexp来获得额外的聪明才智 - 例如,如果你必须与只接受 一个正则表达式的不可更改的API进行交互,而不是更多。