Regex option "Multiline"

本文关键字:quot Multiline option Regex | 更新日期: 2023-09-27 18:05:31

我有一个正则表达式来匹配日期格式与逗号。

yyyy/mm/dd或yyyy/mm

例如:

2016/09/02 2016/08 2016/09/30

我代码:

string data="21535300/11/11'n";
Regex reg = new Regex(@"^(20'd{2}/(0[1-9]|1[012])(/(0[1-9]|[12]'d|30|31))?,?)*$", 
                      RegexOptions.Multiline);
if (!reg.IsMatch(data))
    "Error".Dump();
else
    "True".Dump();

我使用multiline选项。如果字符串数据有"'n"。任何字符都可以匹配这个正则表达式。

例如:

string data="test'n"
string data="2100/1/1"

我在MSDN中找到选项定义。它说:

它改变了^和$ language元素的解释,使它们匹配一行的开始和结束,而不是输入字符串的开始和结束。

我不明白为什么会发生这个问题。有人能解释一下吗?谢谢。

Regex option "Multiline"

您的正则表达式可以匹配在字符串末尾添加换行符后得到的空行。"test'n"包含2行,匹配第二行

在自由间距模式下查看你的正则表达式模式:

^                 # Matches the start of a line
 (                # Start of Group 1
   20'd{2}/
   (0[1-9]|1[012])
   (/
     (0[1-9]|[12]'d|30|31)
   )?,?
 )*                # End of group 1 - * quantifier makes it match 0+ times
$                  # End of line

如果不希望匹配空行,则将最后一个)*替换为)+

另一种选择是使用更展开的模式,如

^20'd{2}/(0[1-9]|1[012])(/(0[1-9]|[12]'d|3[01]))?(,20'd{2}/(0[1-9]|1[012])(/(0[1-9]|[12]'d|3[01]))?)*$

参见regex演示。在代码内部,建议使用块并动态构建模式:

string date = @"20'd{2}/(0[1-9]|1[012])(/(0[1-9]|[12]'d|3[01]))?";
Regex reg = new Regex(string.Format("^{0}(,{0})*$", date), RegexOptions.Multiline);

正如您所看到的,第一个块(在^锚行开始之后)在这里是强制性的,因此空行将永远不会匹配。