不知道为什么我无法在C#中匹配这个正则表达式

时间:2011-09-07 15:40:07

标签: c# .net regex

我正在尝试将字符串“9月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;
        }


    }

4 个答案:

答案 0 :(得分:7)

问题是标志RegexOptions.IgnorePatternWhitespace。删除它,因为你不想忽略正则表达式中的空格 - 你需要它来匹配“九月”和“19”之间的空格。

提示:digits可以更容易编写为[0-9]。更好的正则表达式是

September [0-9]+

答案 1 :(得分:2)

正如@Moritz指出你不匹配,因为你忽略了空白。您还应该注意,您当前的方法将匹配无效的各种“日期”。例如September 67

我建议使用稍微复杂的模式来匹配数字模式:

September ([1-9]|[12][0-9]|3[01])

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

答案 2 :(得分:0)

@“九月\ s \ d +”应该这样做

\ s匹配空格,\ d匹配任何数字,+是前面的1或更多。

答案 3 :(得分:0)

你可以这样试试。

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");