不知道为什么我不能在c#中匹配这个正则表达式

本文关键字:正则表达式 为什么 不能 不知道 | 更新日期: 2023-09-27 18:07:48

我试图匹配字符串"September 12"与以下c#代码。但它不匹配,我不知道为什么。我做错了什么?它似乎可以在regexpal.com上工作

public static void Scan(String str)
    {
        String digits = "(0|1|2|3|4|5|6|7|8|9)";
        String r1 = "September " + digits + "+";
        foreach (Match match in Regex.Matches(str, r1, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace))
        {
            String value = match.Value;
        }

    }

不知道为什么我不能在c#中匹配这个正则表达式

问题是标志RegexOptions.IgnorePatternWhitespace。删除它,因为您不想忽略正则表达式中的空白-您需要它来匹配"September"answers"19"之间的空白。

提示:digits可以更简单地写成[0-9]。更好的正则表达式是

September [0-9]+

正如@Moritz指出的那样,您的不匹配是因为您忽略了空白。您还应该注意到,您当前的方法将匹配大量无效的"日期"。比如September 67

我建议使用稍微复杂一点的模式来匹配数字模式:
September ([1-9]|[12][0-9]|3[01])

这将限制数字在1到31之间。虽然这仍然允许一些无效日期(例如September 31),但它将大大限制匹配的无效日期的数量。

@"September's'd+"应该可以了

's匹配空格,'d匹配任何数字,+是前面的一个或多个。

您可以这样尝试。

public static void Scan(String str)
{
  // This regex is pretty nasty, I would probably take more time to refine it.
  String patt = @"^([A-Za-z]+)('s)('d+)$";
  foreach (Match match in Regex.Matches(str, patt, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace))
  {
    String value = match.Value;
    Console.WriteLine(value);
  }
}

然后这样命名:

Scan("September 2011");