正则表达式如何重复捕获的组?

时间:2017-04-20 16:18:31

标签: c# regex regex-group

拥有以下字符串:

  • AAA.BBBBBBBB et CCCCCC DDDDDDD 31.03.2012.xlsx
  • AAA.BBBBBBBB ZZZZ et CCCCCC UUUU DDDDDDD 15.02.2015.xlsx
  • AAA.BBBBBBBB DDDD et CCCCCC 23 DDDDDDD 03.11.2017.xlsx

我想将字符串分成三部分,例如在第一句中:

  • AAA.BBBBBBBB et CCCCCC DDDDDDD
  • 31.03.2012
  • 的.xlsx

在第三句中:

  • AAA.BBBBBBBB DDDD et CCCCCC 23 DDDDDDD
  • 二〇一七年三月十一日
  • 的.xlsx

对于第一句话,我尝试了以下正则表达式:

^((\w+[\.\s]){5})(\d{2}\.\d{2}\.\d{4})(.+)$

如果我将5更改为+,则无法正常工作。

^((\w+[\.\s]){+})(\d{2}\.\d{2}\.\d{4})(.+)$

我怎样才能做到这一点?

PD:在使用C#应用程序完成实际工作之前,我在Sublime中进行了测试。

2 个答案:

答案 0 :(得分:1)

您可以将命名组与此正则表达式一起使用:
        ^(?<name>.*)(?<date>\d{2}\.\d{2}\.\d{4})(?<file_ext>.+)$

string input = 
@"AAA.BBBBBBBB et CCCCCC DDDDDDD 31.03.2012.xlsx
AAA.BBBBBBBB ZZZZ et CCCCCC UUUU DDDDDDD 15.02.2015.xlsx
AAA.BBBBBBBB DDDD et CCCCCC 23 DDDDDDD 03.11.2017.xlsx";

string pattern = @"^(?<name>.*)(?<date>\d{2}\.\d{2}\.\d{4})(?<file_ext>.+)$";
foreach (Match match in Regex.Matches(input, pattern, RegexOptions.Multiline))
{
    // for each line you can use:
    // match.Groups["name"] , match.Groups["date"] and match.Groups["file_ext"]
}

答案 1 :(得分:0)

由于日期总是相同的长度,因此您不需要正则表达式。我不喜欢使用正则表达式,因为它们很慢。

你可以将它放在一个循环中,我为你提供的每个字符串尝试它可以正常工作。我不是最干净的代码,但是你明白了。

string fileString = "AAA.BBBBBBBB ZZZZ et CCCCCC UUUU DDDDDDD 15.02.2015.xlsx";
string fileName = fileString.Substring(0, fileString.Length-15);
int findExtensionDot = fileString.LastIndexOf(".");
string fileExtension = fileString.Substring(findExtensionDot, fileString.Length - findExtensionDot);
string getDate = fileString.Substring(fileName.Length, fileString.Length - findExtensionDot + 5);

Console.WriteLine(fileName);
Console.WriteLine(fileExtension);
Console.WriteLine(getDate);

结果如下:

fileName: AAA.BBBBBBBB ZZZZ et CCCCCC UUUU DDDDDDD 
fileExtension: .xlsx
getDate: 15.02.2015