2010-05-10 27 views
0

我需要编写一个正则表达式匹配像“abc”,“ab”,“ac”,“bc”,“a”,“b”,“c” 。顺序很重要,它不应该匹配同一部分的多个外观。正则表达式与所有可选部分,但至少需要一个

a?b?c?几乎可以做到这一点。除了它也匹配空字符串。有没有什么办法来防止它匹配空字符串或可能以不同的方式为任务编写正则表达式。

回答

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? 
} 
+0

(?= [abc])a?b?c?或甚至更好(?=(a | b | c))a?b?c? (因为我真正的a,b,c不是字母,而是更长的结构)似乎是完美的。谢谢! – 2010-05-10 15:22:14

0

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

+0

是的,我知道我可以做到这一点,但这是我想避免在这里。 – 2010-05-10 15:10:06

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

这将检查是否有至少有一个人物向前看,并会匹配你的正则表达式。

+0

谢谢。这完全符合前提条件,即它是完整的字符串而不是子字符串。如果我删除^和$,它会与其他符号一样多次匹配。无论如何,这是非常接近的,我会给你一个,但Weblog有一个更接近的解决方案。谢谢! – 2010-05-10 15:20:53

0

尝试将所有问题的所有功能都打包到一个正则表达式中毫无意义。最好的解决方案是编写明显的正则表达式,并添加一个零长度的检查。当你绝对必须使用正则表达式时,你应该更加聪明 - 例如,如果你必须与一个不可更改的API进行交互,该API只接受一个正则表达式,而没有其他更多。

+0

问题不仅是零长度,而且它基本上匹配每个不匹配符号之间的所有“虚无”。所以对于像“zxvnm”这样的字符串,将会有5个匹配。 – 2010-05-10 15:24:09

相关问题