C#中的正则表达式模式问题

时间:2019-10-11 05:56:18

标签: c# regex

我在C#编程语言中遇到正则表达式模式问题。我的regex模式似乎不像在Regexr上那样工作,即使对于不为空或不在列表中的值,我也能找到匹配项,其中我的regex用于特定的值列表和空字符串。以下是一段代码,可以演示问题的实质:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var pattern = "^(2|4|First|Fourth)?";
        var regex = new Regex(pattern);
        var empty = "";
        var number = "3";
        var yes = "yes";
        var str = "str";

        Console.WriteLine("empty " + regex.IsMatch(empty));
        Console.WriteLine("number " + regex.IsMatch(number));
        Console.WriteLine("yes " + regex.IsMatch(yes));
        Console.WriteLine("string " + regex.IsMatch(str));
    }
}

它不应该匹配str3。也许您可以提出一些解决方案?

2 个答案:

答案 0 :(得分:2)

模式(2|4|First|Fourth)将与24FirstFourth匹配,您是正确的,^的字符串开头(所谓的定位符),但是您不知道的是?运算符,这意味着**匹配零个或一个出现的模式, so, since it's applied to whole(2 | 4 | First | Fourth)`模式,将匹配每个字符串。

您可以这样认为:匹配锚定在hte字符串开头的模式,但匹配零或一次,所以,也匹配字符串的开头

Demo中看到,每个字符串都匹配(匹配字符串的开头)。

只需删除?运算符或将其替换为$,即可匹配字符串的结尾(如果需要)。

要同时允许使用空字符串,请使用^(2|4|First|Fourth|)$-它会使用$固定字符串的末尾(如上所述),在您的替换中还添加了另一种可能性,即允许将空字符串匹配。

Another demo

答案 1 :(得分:0)

如果要匹配空选项或多个选项(如您在comments中提到的那样),则可以采用以下方法:

"^(|2|4|First|Fourth)$"

它将与empty, "2", "4", "First" or "Fourth"相匹配。


您提出的模式的问题是?使整个组都是可选的,因此它将匹配任何:)。