我有以下代码:
string rex = "a*";
string txt = "cvb";
Regex regex = new Regex(rex);
Console.WriteLine("Success:" + regex.IsMatch(txt));
此代码始终返回 true 。 我认为a *模式只能匹配:“”,“a”,“aa”,“aaa ....”。
我测试了这种情况here。
同样的例子并不匹配。
答案 0 :(得分:12)
^a*$
只会出现这种情况。由于您没有使用开始和结束锚点,因此它将始终与任何字符串中的“无”匹配。
答案 1 :(得分:6)
如果您仔细查看RegexPlanet结果,您会看到,matches()
方法失败时,find()
和lookingAt()
都会返回true
。 matches()
隐含地在两端锚定匹配,就好像你已经写了^a*$
一样。 lookingAt()
仅在开头自动锚定匹配,而find()根本不会锚定它。
当然,这些都是Java方法,它们是RegexPlanet使用的正则表达式。 .NET的IsMatch()
方法等同于Java find()
,它没有matches()
或lookingAt()
的等价物(并且不需要它们)。如果你希望匹配锚定,你必须自己锚定它。
答案 2 :(得分:3)
正则表达式中的星号表示前一项的出现次数为零或更多。
在这种情况下,预定项是“a”字符,正则表达式中没有其他内容。
因此,这个正则表达式表示“零个或多个”字符。
由于您声明您希望将“a”,“aa”或“aaa”与您的a*
匹配,那么您可能想要的而不是明星是一个加号。这将表示“前面一项或多项”。
[编辑]
正如@Bindy所说,如果你想匹配一个空字符串以及任何数量的'a'(我错过了一个点),那么你还需要匹配它。
在这种情况下,@ Bindy的解决方案可行。
或者,使用a+
的解决方案如下所示:
(a+|^$)
这将匹配一个或多个'a'或空字符串。请注意,这与@Bindy的解决方案不同,因为他的解决方案仅匹配字符串仅包含'a'而不包含任何其他内容,而mine将匹配包含一个或多个'a'或空字符串的任何字符串。
你的例子并没有真正涵盖那些你想要的东西(我的预感是你更接近@Bindy的答案而不是这个,但我觉得我还应该在这里添加它)
答案 3 :(得分:-1)
答案 4 :(得分:-1)
a *告诉Regex解释器匹配0到多次。我相信你想要的是a.*
,或者如果你想让它影响整个字符串,只有当第一个字符是a时匹配,那么$a.*^