我有一个正则表达式,用逗号匹配日期格式。
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();
我使用选项多线。 如果字符串数据有“\ n”。 任何角色都会匹配此正则表达式。
例如:
string data="test\n"
string data="2100/1/1"
I find option definition in MSDN。它说:
它改变了^和$ language元素的解释,使它们匹配行的开头和结尾,而不是输入字符串的开头和结尾。
我不明白为什么会出现这个问题。 有人可以解释一下吗? 感谢。
答案 0 :(得分: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
如果您不希望它与空行匹配,请将最后一个)*
替换为)+
。
另一种方法是使用更多展开的模式,如
^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 demo。在代码内部,建议使用块并动态构建模式:
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);
正如您所看到的,第一个块(在行^
锚点开始之后)在这里是强制,因此空行永远不会匹配。