首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex选项"Multiline“

Regex选项"Multiline“
EN

Stack Overflow用户
提问于 2016-09-02 07:26:51
回答 1查看 1.1K关注 0票数 5

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

yyyy/mm/dd或yyyy/mm

例如:

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

我的代码:

代码语言:javascript
复制
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“。任何字符都会匹配这个正则表达式。

例如:

代码语言:javascript
复制
string data="test\n"
string data="2100/1/1"

我在MSDN中找到了选项定义。上面写着:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-02 07:33:51

您的regex可以匹配在字符串末尾添加换行符后得到的空行。"test\n"包含2行,第二行得到匹配。

请在空闲间隔模式下查看regex模式:

代码语言:javascript
复制
^                 # 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

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

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

代码语言:javascript
复制
^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演示。在代码中,建议使用块并动态构建模式:

代码语言:javascript
复制
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);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39286641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档