获取字符/字符串倒数第二次出现之后的字符串

本文关键字:字符串 之后 第二次 倒数第二 字符 倒数 获取 | 更新日期: 2023-09-27 18:28:47

我有一个不寻常的项目,我需要检索字符"''"倒数第二次出现后的文本,有效地为我提供了以下示例字符串中的最后两个目录:

  • D: ''存档目录'' 2015-12-31 PM ''序列号_01
  • D: ''存档目录''2016-01-01''序列号_02
  • D: ''存档目录'' 2016年1月''序列号_03

期望的结果分别是:

  • 2015年12月31日下午''序列号_01
  • 2016-01-01''序列号_02
  • 2016年1月''序列号_03

我想尽可能干净地完成这项工作,最好是在每个字符串的一行代码中完成。

我在Stack Overflow上找不到关于在c#中查找字符串或字符的倒数第二次出现(或者,就这一点而言,任何第N次出现向后)的任何信息后,回答了这个问题。如果社区发现这个问题重复或觉得它太模糊,我愿意删除它。

编辑:澄清了我不需要将其作为字符串列表来执行;它们将一次运行一个。我正在动态地将它们作为单选按钮控件添加到表单中。

获取字符/字符串倒数第二次出现之后的字符串

您不需要regex,您可以依赖.NET提供的内置路径处理。

var input = new List<string> { 
    @"D:'Archive Directory'2015-12-31 PM'SerialNo_01",
    @"D:'Archive Directory'2016-01-01'SerialNo_02",
    @"D:'Archive Directory'January 2016'SerialNo_03"
};
var result = input.Select(s => Path.Combine(Directory.GetParent(s).Name, Path.GetFileName(s)));

收益率:

2015-12-31 PM'SerialNo_01 
2016-01-01'SerialNo_02 
January 2016'SerialNo_03 

然后您就不需要担心边缘情况,甚至不需要担心跨操作系统的兼容性。

在根据这个聪明的答案调整代码后,我能够想出一个解决方案。

myString.Split('''').Reverse().Take(2).Aggregate((s1, s2) => s2 + "''" + s1);

这将在每个反斜杠处拆分字符串,然后反转生成的字符串数组,只取最后两个元素,然后将它们重新连接在一起,现在按相反的顺序,得到所需的结果。

您还可以匹配所需的部件。

(?<='')[^'']*''[^'']*$

请参阅演示。

https://regex101.com/r/fM9lY3/56

string strRegex = @"(?<='')[^'']*''[^'']*$";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
string strTargetString = @"D:'Archive Directory'2015-12-31 PM'SerialNo_01" + "'n" + @"D:'Archive Directory'2016-01-01'SerialNo_02" + "'n" + @"D:'Archive Directory'January 2016'SerialNo_03";
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here
  }
}
If you still want to use Regex, you can use
Match match = Regex.Match(inputString,@".:''.*''(.*''.*)");
if(match.success)
{
Result = match.Groups[1].value;
}
The first group in match will give the required result

对于多个结果,请使用Matches而不是匹配

List<string> paths = new List<string> { 
                    @"D:'Archive Directory'2015-12-31 PM'SerialNo_01",
                    @"D:'Archive Directory'2016-01-01'SerialNo_02",
                    @"D:'Archive Directory'January 2016'SerialNo_03" };
var requiredPaths = paths.Select(item=> string.Join(@"'",item.Split('''').
                                 Reverse().Take(2).Reverse()));