[英]Does RegEx a* match all strings?
我有以下代码:
string rex = "a*";
string txt = "cvb";
Regex regex = new Regex(rex);
Console.WriteLine("Success:" + regex.IsMatch(txt));
此代码始终返回true 。 我认为模式 a* 只会匹配:“”、“a”、“aa”、“aaa....”。
我在这里测试了这种情况。
同样的例子不匹配。
这只适用于^a*$
。 由于您没有使用开始和结束锚点,因此它将始终匹配任何字符串中的“无”。
如果您仔细查看 RegexPlanet 结果,您会发现,虽然matches()
方法失败,但find()
和lookingAt()
都返回true
。 matches()
在两端隐式锚定匹配,就好像你写^a*$
一样。 lookingAt()
仅在开头自动锚定匹配,而 find() 根本不锚定它。
当然,这些都是 Java 方法,这是 RegexPlanet 使用的正则表达式风格。 .NET 的IsMatch()
方法等价于 Java 的find()
,它没有matches()
或lookingAt()
的等价物(并且不需要它们)。 如果你想锚定比赛,你必须自己锚定它。
正则表达式中的星号表示前一项出现零次或多次”。
在这种情况下,前置项是“a”字符,正则表达式中没有其他内容。
因此,此正则表达式表示“零个或多个 'a' 字符”。
由于您希望 state 与您a*
匹配 'a'、'aa' 或 'aaa' ,那么您可能想要的而不是星号是加号。 这将表示“一个或多个前面的项目”。
[编辑]
正如@Bindy 所说,如果你想匹配一个空字符串以及任意数量的'a'(我错过了一点),那么你也需要匹配它。
在这种情况下,@Bindy 的解决方案会起作用。
或者,使用a+
的解决方案如下所示:
(a+|^$)
这将匹配一个或多个 'a' 或一个空字符串。 请注意,这与@Bindy 的解决方案不同,因为他的解决方案仅匹配字符串仅包含 'a' 而没有其他内容的情况,而我的解决方案将匹配包含一个或多个 'a' 或空字符串的任何字符串。
你的例子并没有真正涵盖你想要的那些(我的预感是你比这更接近@Bindy的答案,但我觉得我仍然应该在这里添加它)
a* 告诉正则表达式解释器匹配 0 到多次。 我相信您想要的是a.*
,或者如果您希望它影响整个字符串,并且仅在第一个字符是 a 时才匹配,那么$a.*^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.