Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式奇怪,为什么会发生这种情况?_C#_Regex - Fatal编程技术网

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

C# 正则表达式奇怪,为什么会发生这种情况?,c#,regex,C#,Regex,此简单正则表达式与电影的文本匹配。我把这个理解为“Q重复了零次或更多次”是错的吗?为什么它匹配,它不应该返回false吗 public class Program { private static void Main(string[] args) { Regex regex = new Regex("Q*"); string input = "Movie"; if (regex.IsMatch(input)) {

此简单正则表达式与
电影
的文本匹配。我把这个理解为“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.");
        }
    }
}

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

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


您正确地阅读了这个正则表达式,因为它重复了0次或更多次。这就是
0
。当您尝试正则表达式时,它将尝试查找任何成功的匹配项

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

(Q*)
获取捕获组并使用
.Matches
组[1]。Value
查看捕获的内容。您将看到它是一个空字符串


通常,如果要检查字符是否存在,不使用正则表达式,而是使用。否则,如果您确实想使用正则表达式,您应该删除量词,或者使用至少匹配一个特定字符的量词。

尝试
\Q{0,}
并查看这是否适用于您是的,它匹配,不匹配,
零时间
。打印匹配结果以查看它是否不匹配。您为引擎提供了一个选项,可以将事物与
*
{0,n}
量词进行匹配。
^Q*$
的负等价物
^[^Q]+$
。我想空字符串可能是有效的,但它很少用正则表达式这样验证。@sln我不知道你想用它说什么。匹配空字符串的目的是什么?@sln在许多有效的用例中,接受空匹配是绝对正确的。验证就是一个例子(例如,“我不在乎您是否输入了值,但当您输入值时,请使用正确的格式”)。另外,OP显然知道
Q*
可以匹配空字符串,因此这很可能是期望的行为。我真的不明白你的意思。
Q*
也匹配非空字符串。他没有使用开始/结束锚。必需输入没有空字符串选项,可能不应验证可选输入。如果需要验证,则需要对无效性进行单数阳性检查。事实上,大多数需要严格格式的输入应该是事件驱动的,不允许无效的按键或粘贴无效的字符。这是一个有效的观点还是我偏离了底线?
(Q*)