获取第二次出现的字符/字符串

时间:2016-01-04 06:05:36

标签: c# regex string linq

我有一个不寻常的项目,我需要在第二次出现的字符“\”之后检索文本,实际上给了我以下示例字符串中的最后两个目录:

  • D:\ Archive Directory \ 2015-12-31 PM \ SerialNo_01
  • D:\ Archive Directory \ 2016-01-01 \ SerialNo_02
  • D:\ Archive Directory \ January 2016 \ SerialNo_03

期望的结果分别是:

  • 2015-12-31 PM \ SerialNo_01
  • 2016年1月1日\ SerialNo_02
  • 2016年1月\ SerialNo_03

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

在Stack Overflow上找不到关于在c#中查找字符串或字符内的字符串或字符的第二次出现(或者,就此而言,任何第N次出现的事件)时,我正在回答这个问题。如果社区发现这个问题是重复的,或者觉得这个问题过于模糊,我愿意将其删除。

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

5 个答案:

答案 0 :(得分:3)

您不需要正则表达式,您可以依赖.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 

然后,您不必担心边缘情况,甚至是跨操作系统兼容性。

答案 1 :(得分:1)

在调整this clever answer的代码后,我能够找到解决方案。

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

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

答案 2 :(得分:1)

您也可以匹配您想要的部分。

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

参见演示。

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
  }
}

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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()));