繁体   English   中英

RegEx a* 是否匹配所有字符串?

[英]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*$

似乎工作

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM