正则表达式选项"Multiline"

Yic*_*Lin 5 c# regex

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

yyyy/mm/dd或yyyy/mm

例如:

2016/09/02,2016/08,2016/9月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();
Run Code Online (Sandbox Code Playgroud)

我使用选项多线.如果字符串数据有"\n".任何角色都会匹配此正则表达式.

例如:

string data="test\n"
string data="2100/1/1"
Run Code Online (Sandbox Code Playgroud)

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

它改变了^和$语言元素的解释,使它们匹配行的开头和结尾,而不是输入字符串的开头和结尾.

我不明白为什么会出现这个问题.有人可以解释一下吗?谢谢.

Wik*_*żew 2

您的正则表达式可以匹配在字符串末尾添加换行符后得到的空行。"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
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是使用更展开的图案,例如

^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]))?)*$
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示。在代码内部,建议使用块并动态构建模式:

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);
Run Code Online (Sandbox Code Playgroud)

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