【问题标题】:Regular Expression how to repeat a captured group?正则表达式如何重复捕获的组?
【发布时间】:2017-04-20 16:18:30
【问题描述】:

具有以下字符串:

  • AAA.BBBBBBBB 等 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 等 CCCCCC DDDDDDD
  • 31.03.2012
  • .xlsx

第三句:

  • AAA.BBBBBBBB DDDD et CCCCCC 23 DDDDDDD
  • 03.11.2017
  • .xlsx

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

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

如果我将 5 更改为 +,它不起作用。

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

我怎样才能做到这一点?

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

【问题讨论】:

  • 删除 {} 括号仅使用 + 符号所以 ^((\w+[\.\s])+)(\d{2}\.\d{2}\.\d{4})(.+)$。顺便说一句,当你想测试你的正则表达式时,我推荐你 regex101.com
  • 你不需要正则表达式,因为左边的 15 个字符总是相同的长度
  • SublimeText 3 使用 PCRE 引擎,而 C# 使用 .NET - 只有当你的模式是基本的时才可以。
  • 如果将{5} 更改为{5,},您认为会发生什么?
  • @prospector 说了什么。可以通过lastIndexOf获取文件扩展名,日期为之前的10个字符,名称为剩余部分。使用正则表达式可能最终会导致更多问题,然后解决。这只是基本的子字符串操作。

标签: c# regex regex-group


【解决方案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"]
}

【讨论】:

    【解决方案2】:

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

    你可以把它放在一个循环中,我对你提供的每个字符串都试过了,效果很好。不是我匆忙写的最干净的代码,但你明白了。

    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
    

    【讨论】:

      猜你喜欢
      • 2017-09-13
      • 2011-03-11
      • 2017-01-07
      • 2019-12-19
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多