正则表达式奇怪,为什么会发生这种情况?

时间:2014-02-20 17:43:43

标签: c# regex

这个简单的正则表达式与Movie的文本相匹配。我读错了“Q重复零次或多次”是错误的吗?它为什么匹配,不应该返回false?

public class Program
{
    private static void Main(string[] args)
    {
        Regex regex = new Regex("Q*");
        string input = "Movie";
        if (regex.IsMatch(input))
        {
            Console.WriteLine("Yup.");
        }
        else
        {
            Console.WriteLine("Nope.");
        }
    }
}

2 个答案:

答案 0 :(得分:5)

正如您所说,这意味着“Q重复或更多次”。在这种情况下,它是零次,因此您实际上是在尝试匹配输入字符串中的""。由于IsMatch不关心它匹配的 ,它可以匹配输入字符串中任何位置的空字符串,因此它返回true。

如果您想确保整个输入字符串必须匹配,可以添加^$"^Q*$"

Regex regex = new Regex("^Q*$");
Console.WriteLine(regex.IsMatch("Movie")); // false
Console.WriteLine(regex.IsMatch("QQQ")); // true
Console.WriteLine(regex.IsMatch("")); // true

答案 1 :(得分:2)

你正确地阅读这个正则表达式Q重复0次或更多次。与之相关的是0。当你尝试使用正则表达式时,它会尝试找到任何成功的匹配。

正则表达式匹配字符串的唯一方法是尝试匹配一个空字符串(0次),它出现在匹配之间的任何地方,如果之前你不知道,是的,正则表达式可以匹配空字符之间的字符串你可以尝试:

(Q*)

获取捕获组并使用.MatchesGroups[1].Value查看已捕获的内容。你会看到它是一个空字符串。

通常,如果要检查字符是否存在,则不要使用正则表达式,而是使用.Contains。否则,如果你想使用正则表达式,你可以删除量词,或者使用与至少一个特定字符匹配的量词。