Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 帮助简化此正则表达式模式_C#_Regex - Fatal编程技术网

C# 帮助简化此正则表达式模式

C# 帮助简化此正则表达式模式,c#,regex,C#,Regex,我有一个与以下字符串匹配的正则表达式: <!-- 09-02-2009 ---> <!-- 09-02-2009 12:00:00 ---> <!-- 09-02-2009 12:00:00 A ---> <!-- 09-02-2009 12:00:00 AM ---> 模式如下: <!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?:(?: ?

我有一个与以下字符串匹配的正则表达式:

<!-- 09-02-2009 --->
<!-- 09-02-2009 12:00:00 --->
<!-- 09-02-2009 12:00:00 A --->
<!-- 09-02-2009 12:00:00 AM --->

模式如下:

<!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?:(?: ?\d{2}:?){3}?(?: ?[aApP][mM]?)?)? --->

根据twistol更新图案:

<!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?<time>(?: ?(?:\d{2}:){2}\d{2})?(?: ?[aApP][mM]?)?)? --->

我能做些什么来简化这个模式吗

谢谢

编辑 下面是我提出的所有注释/答案的模式,以及内置的验证。这有点难看,但谁说正则表达式需要漂亮呢P

<!-- (?<month>(?:0[1-9]|1[0-2]))-(?<day>(?:0[1-9]|1[0-9]|2[0-9]|3[01]))-(?<year>\d{4})(?<time> (?:0[0-9]|1[0-9]|2[0-3]):(?:[0-5][0-9])(?::[0-5][0-9])?(?: [aApP][mM]?)?)? --->

它将以以下格式匹配有效日期:

<!-- 09-02-2009 --->
<!-- 09-02-2009 12:00 --->
<!-- 09-02-2009 12:00 A --->
<!-- 09-02-2009 12:00 AM --->
<!-- 09-02-2009 12:00:00 --->
<!-- 09-02-2009 12:00:00 A --->
<!-- 09-02-2009 12:00:00 AM --->


就我所能想到的那么简单。请注意,这个正则表达式并不完全相同,因为在原始版本中,时间戳冒号都是可选的,这意味着它将匹配01:0203或0102:03:,等等。我认为我的版本可能更正确

基本上,我删除了我能删除的所有非捕获组和量词,当它们仅仅是一个数字的两倍时,它的可读性就会降低,而不是更多。我还删除了量词上的贪婪修饰符,因为它们总是正好匹配2或4,或者不管它是否贪婪

当然,这将匹配无效日期,例如13-32-0000。要解决这个问题,您必须决定一个复杂但正确的解决方案是否比一个简单、更容易理解的解决方案更可取。基本上,这取决于你对这篇文章的信心。如果您希望过滤掉误报,请选择更正确的解决方案,即使它的可读性稍差。


就我所能想到的那么简单。请注意,这个正则表达式并不完全相同,因为在原始版本中,时间戳冒号都是可选的,这意味着它将匹配01:0203或0102:03:,等等。我认为我的版本可能更正确

基本上,我删除了我能删除的所有非捕获组和量词,当它们仅仅是一个数字的两倍时,它的可读性就会降低,而不是更多。我还删除了量词上的贪婪修饰符,因为它们总是正好匹配2或4,或者不管它是否贪婪

当然,这将匹配无效日期,例如13-32-0000。要解决这个问题,您必须决定一个复杂但正确的解决方案是否比一个简单、更容易理解的解决方案更可取。基本上,这取决于你对这篇文章的信心。如果你想过滤掉误报,那就找一个更正确的解决方案,即使它的可读性稍差。

以下是我的看法

(?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4})(?:\s\d{2}:\d{2}:\d{2}\s?[aApP]?[mM]?)?
(?\d{2}?-(?\d{2}?-(?\d{4})(?:\s\d{2}:\d{2}:\d{2}\s?[aApP]?[mM]?)?
似乎不能再短了。

这是我的看法

(?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4})(?:\s\d{2}:\d{2}:\d{2}\s?[aApP]?[mM]?)?
(?\d{2}?-(?\d{2}?-(?\d{4})(?:\s\d{2}:\d{2}:\d{2}\s?[aApP]?[mM]?)?

似乎不能再缩短了。

为什么要使用Regex来完成此任务,而不使用.NET中包含的
Convert.ToDateTime()
DateTime.Parse()或
DateTime.TryParse()
方法


为什么要使用Regex来处理这个问题,而不使用.NET中包含的
Convert.ToDateTime()
DateTime.Parse()或
DateTime.TryParse()方法



这取决于您使用的正则表达式的味道。Perl、JS等不能说我可以帮助简化它,但这一点不也符合“11:11:11:”(注意额外的:)<代码>(?:?\d{2}:?){3}?
很抱歉,我没有指定,我正在C#项目中使用它。@twistol-是的,您似乎是正确的。我可能应该扩展该部分,使其不匹配该字符串。它还将匹配“99-99-99999:99:99”,这取决于您使用的正则表达式的风格。Perl、JS等不能说我可以帮助简化它,但这一点不也符合“11:11:11:”(注意额外的:)<代码>(?:?\d{2}:?){3}?
很抱歉,我没有指定,我正在C#项目中使用它。@twistol-是的,您似乎是正确的。我可能应该扩展该部分,使其与该字符串不匹配。它还将与“99-99-99999:99:99”匹配。好的,谢谢,我知道你在那里做了什么。我将尝试修改此模式,以接受annakata在OP注释下指出的有效日期值。您的和原始版本不都只匹配-->(3个破折号),而不是-->(2个破折号),因为大多数原始示例都包含?@Twistol-oops,我忘记了第三个破折号。那是一种类型;(@Twisol:oops.没注意到当我复制意大利面时!我把它改成假设它是原始正则表达式中的一个拼写错误,应该是两个破折号。在你的“这将匹配无效日期”上答案之一是,我认为像这样的正则表达式更适合于格式的简单验证,而实际的数据验证将在之后进行。它(a)有助于更清晰的正则表达式,(b)在“有效数据”中非常有用域可能是动态的或复杂的。好的,谢谢,我知道你在那里做了什么。我将尝试修改此模式以接受annakata在OP注释下指出的有效日期值。你的和原始的不都只在-->(3个破折号)上匹配,而不是-->(2个破折号)由于大多数原始示例都包含?@Twistol-oops,我忘记了第三个破折号。这是一个类型;(@Twisol:oops。我在复制意大利面时没有注意到它!我将其更改为假设它是原始正则表达式中的一个错误,应该是两个破折号。在您的“这将匹配无效日期”中答案之一是,我认为像这样的正则表达式更适合于格式的简单验证,而实际的数据验证将在之后进行。它(a)有助于更清晰的正则表达式,(b)在“有效数据”中非常有用域可能是动态的或复杂的。请务必注意,此域将匹配比原始域更多的无效数据,例如,时间部分可能是01:02:03M,因为空格和a/p字符都是m的互斥可选字符。请务必注意,此域将匹配