Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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_Regex Group - Fatal编程技术网

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

C# 正则表达式如何重复捕获的组?,c#,regex,regex-group,C#,Regex,Regex Group,具有以下字符串: AAA.BBBBBB et CCCCC DDDDD 31.03.2012.xlsx AAA.BBBBBBZZZ和CCCC UUU DDDDD 2015.02.xlsx AAA.bbbbbbdddd et CCCCCC 23 dddddddd 03.11.2017.xlsx 我想将字符串分成三部分,例如在第一句中: AAA.BBBBBB et CCCCC DDD 2012年3月31日 .xlsx 在第三句中: AAA.BBBBBBDDDD和CCCCC 23 DDDD 2

具有以下字符串:

  • AAA.BBBBBB et CCCCC DDDDD 31.03.2012.xlsx
  • AAA.BBBBBBZZZ和CCCC UUU DDDDD 2015.02.xlsx
  • AAA.bbbbbbdddd et CCCCCC 23 dddddddd 03.11.2017.xlsx
我想将字符串分成三部分,例如在第一句中:

  • AAA.BBBBBB et CCCCC DDD
  • 2012年3月31日
  • .xlsx
在第三句中:

  • AAA.BBBBBBDDDD和CCCCC 23 DDDD
  • 2017年11月3日
  • .xlsx
对于第一句话,我尝试了以下正则表达式:

^((\w+[\.\s]){5})(\d{2}\.\d{2}\.\d{4})(.+)$
如果我把5换成+,它就不起作用了

^((\w+[\.\s]){+})(\d{2}\.\d{2}\.\d{4})(.+)$
我怎样才能做到这一点


PD:在使用C#app进行真正的工作之前,我正在Sublime中进行测试。

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

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

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

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

字符串输入=
@“AAA.BBBB et CCCCC DDDDD 31.03.2012.xlsx
AAA.BBBBBBZZZ和CCCC UUU DDDDD 2015.02.xlsx
AAA.bbbbdddd et CCCCCC 23 dddddddd 03.11.2017.xlsx”;
字符串模式=@“^(?.*)(?\d{2}\.\d{2}\.\d{4})(?.+)$”;
foreach(Regex.Matches中的匹配(输入、模式、RegexOptions.Multiline))
{
//对于您可以使用的每一行:
//match.Groups[“name”]、match.Groups[“date”]和match.Groups[“file_ext”]
}

remove
{}
方括号仅使用
+
符号so
^(\w+[\.\s])+)(\d{2}.\d{2}.\d{4})(.+)$
。顺便说一句,当你想测试你的正则表达式时,我建议你不需要正则表达式,因为左边的15个字符总是一样长升华文本3使用PCRE引擎和C#使用.NET-只有在你的模式是基本的情况下才行。如果你将
{5}
更改为
{5,},你认为会发生什么
?什么是@prospector说的。您可以使用lastIndexOf获取文件扩展名,日期是之前的10个字符,名称是剩余部分。使用regex可能会导致更多的问题,然后再解决。这只是基本的子字符串操作。
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"]
}