RegEx可选组匹配

时间:2016-05-18 18:09:43

标签: regex

我试图弄清楚如何创建一个包含以下两行的正则表达式:

02-09-16  08:57PM                24768 Invoice - Copy.docx

05-14-16  08:49PM       <DIR>          Bin

两者都是目录列表的结果。第一个是包含文件大小的文件。第二个是没有大小但包含类型<Dir>的目录。

这允许我将所有数据捕获到命名组中,但第一行的大小被捕获到Type字段中:

(?<Date>\S+)\s+(?<Time>\S+)\s+(?<Type>\S+)\s+(?<Name>.+)

如果可能的话,我希望以类型和尺寸结束。我不确定如何同时查找这两个,但如果找到一个,则忽略其中一个。

更新:根据Wiktor的回复,我更新了Regex并且更加接近:

(?<Date>\S+)\s+(?<Time>\S+)\s+(?:(?<Type>\S+)|\d+)\s+(?<Name>.+)

使用这个我可以很容易地解析这两行。但是,第一行24768在类型组中结束。是否可以同时拥有Type和其他Size组?逻辑就像是如果遇到字符(&#39; <Dir>&#39;),例如,类型;如果你遇到数字(24768),这是大小

1 个答案:

答案 0 :(得分:1)

只需将类型和大小捕获分组为非捕获组或组:

^(?<Date>\S+)\s+(?<Time>\S+)\s+(?:(?<Size>\d+)|(?<Type>\S+))\s+(?<Name>.+)$

大小字段将获取数字,否则您将获得一个类型。