我有一个不寻常的项目,我需要在第二次出现的字符“\”之后检索文本,实际上给了我以下示例字符串中的最后两个目录:
期望的结果分别是:
我想尽可能干净地完成这项工作,最好是每行代码的一行代码。
在Stack Overflow上找不到关于在c#中查找字符串或字符内的字符串或字符的第二次出现(或者,就此而言,任何第N次出现的事件)时,我正在回答这个问题。如果社区发现这个问题是重复的,或者觉得这个问题过于模糊,我愿意将其删除。
编辑:澄清我不需要将其作为字符串列表;他们将一次运行一个。我正在将它们作为单选按钮控件动态添加到表单中。
答案 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()));