如何使用正则表达式在一段时间内使第二个和毫秒值可选

时间:2015-04-28 15:29:46

标签: c# regex

我正在阅读文本文件。大多数这些文件的开头都有日 - 月 - 年小时:分钟这里的一些文字 ...如下所示

BaseFragment

我为这个

写了一个正则表达式
    28-09-2012 12:46 Some text here.....

这很有效。它读取以连字符 - 分隔的日,月和年,以及以冒号分隔的小时和分钟,然后使用反斜杠s \ s之间的空格即可。我想要的是更改正则表达式,以便在将来出现在其他文件中时可以选择包括秒和毫秒,如下所示..

    (?<date>(?<day>\d{1,2})-(?<month>\d{1,2})-(?<year>(?:\d{4}|\d{2}))\s(?<time>(?<hour>\d{2}):(?<minutes>\d{2})))\s(?<textFileEntry>.*)

我写过这个正则表达式,但它不正确。

            28-09-2012 12:46:12:123 Some text here.....

我虽然。?允许可选用途?任何人都可以看到我在正则表达式中缺少的东西吗?谢谢。

3 个答案:

答案 0 :(得分:3)

您正在转义点(如此\.),因此您匹配文字点,您只需将点更改为冒号,如下所示:

(?<date>(?<day>\d{1,2})-(?<month>\d{1,2})-(?<year>(?:\d{4}|\d{2}))\s(?<time>(?<hour>\d{2}):(?<minutes>\d{2})(?<seconds>:\d{2})?(?<milli>:\d{0,3})?))\s(?<logEntry>.*)

<强> Working demo

另请注意,我添加?将秒和毫米设置为可选:

(?<seconds>:\d{2})?(?<milli>:\d{0,3})?
                  ^-- here and here -^

顺便说一下,如果你真的想使用.作为通配符,那么任何字符都可以用作第二个/铣削分隔符。

您可以清楚地看到下面的模式:

Regular expression visualization

答案 1 :(得分:1)

.只匹配一个字符,除非你将其转义(你做过),在这种情况下它只匹配字符.

此外,如果你想让整个组都是可选的,那就使用(:(?<milli>\d{0,3}))?,这样就可以在你希望选择的整个parathesis之后使用asteriks。

答案 2 :(得分:0)

联邦有几乎是正确的,但他的正则表达式抓住冒号:在秒和毫秒内的字符 - 使用此https://regex101.com/r/bU9bJ6/1

(?<date>(?<day>\d{1,2})-(?<month>\d{1,2})-(?<year>(?:\d{4}|\d{2}))\s(?<time>(?<hour>\d{2}):(?<minutes>\d{2}))(:\:?(?<seconds>\d{2})?)?\:?(?<mili>\d+)?)\s(?<logEntry>.*)