2011-04-27 56 views
3

我有以下代码:RegEx a *是否匹配所有字符串?

string rex = "a*"; 
string txt = "cvb"; 
Regex regex = new Regex(rex); 
Console.WriteLine("Success:" + regex.IsMatch(txt)); 

此代码返回总是真正。 我认为模式a *只会匹配:“”,“a”,“aa”,“aaa ....”。

我测试了这种情况here

而同样的例子不匹配。

+0

在您链接到的测试网站上,它确实显示find()可以用于该组合。 – 2011-04-27 15:29:55

回答

12

这只会是^a*$的情况。由于您没有使用开始和结束锚点,因此它将始终与任何字符串中的“无”匹配。

+0

'^'和'$'锚是重要的,但更重要的是'*'和'+'之间的区别,你似乎完全错过了。 – Spudley 2011-04-27 15:23:17

+1

除了他希望它匹配“”,所以'+'是不合适的。 – 2011-04-27 15:24:48

+2

@Spudley,我想*你*错过了什么,OP *希望*也匹配一个空字符串。他只是不知道IsMatch是返回部分匹配。 – Blindy 2011-04-27 15:25:18

3

在一个正则表达式的星形表示前述项目的零个或多个occurrances”。

在这种情况下,prededing产品在“正则表达式”中没有别的东西

因此,这个正则表达式表示“零个或多个'个'字符'

既然您声明您期望与您的a*匹配'a','aa'或'aaa',那么您可能想要的不是星星而是一个加号。这将表明“一个或多个前面的项目”。

[编辑]

由于@Bindy说,如果你想匹配一个空字符串,以及任意数量的“一的(我错过了一个点),那么你就需要也符合该。

在这种情况下,@ Bindy的解决方案将工作。

另外,使用a+的解决方案是这样的:

(a+|^$) 

这将匹配一个或更多的“一的,或一个空字符串。请注意,这与@ Bindy的解决方案不同,因为他的解决方案只匹配字符串只包含'a'而没有其他内容,而我的匹配任何包含一个或多个'a'或空字符串的字符串。

你的例子并没有真正涵盖这些将是你想要的东西(我的预感是你indended更接近于@ Bindy的答案不是这个,但我觉得我还是应该在这里新增)

+0

感谢您的解释。我不明白的是为什么不同的正则表达式实现会产生不同的结果。 – 2011-04-27 15:32:49

+0

@gonzalog,不同如何?这些简单的东西在几乎所有现代正则表达式实现中都是一致的。 – Blindy 2011-04-27 15:51:44

+0

@gonzalog - 我想@Alan Moore的回答很好地解释了这个问题的答案。 – Spudley 2011-04-27 15:53:11

-1

一个*正在告诉正则表达式解释器匹配0到很多次。我相信你想要的是a.*,或者如果你希望它影响整个字符串,且仅当第一个字符是一个,然后$a.*^

+0

我认为它实际上是:'^ a $'。在任何情况下,'+'符号都会比'.'多出'*'。 – PedroC88 2011-04-27 15:28:01

+0

修正了这个问题,尽管它仍然是错误的。 – Blindy 2011-04-27 15:29:18

6

如果你把在RegexPlanet仔细一看结果,你会看到那场比赛,而matches()方法失败,则find()lookingAt()均返回truematches()隐含在两端的匹配,如果你写了^a*$lookingAt()仅在开始处自动锚定匹配,而find()根本不锚定。

当然,这些都是Java方法,这是RegexPlanet使用的正则表达式。 .NET的IsMatch()方法相当于Java的find(),并且它没有等效的matches()lookingAt()(并且不需要它们)。如果你想要匹配的锚定,你必须自己锚定它。

+0

啊。是。这会得到“+1:有洞察力”。这就很好地解释了OP的困惑是如何产生的。 – Spudley 2011-04-27 15:54:45

相关问题