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

C# 获取字符/字符串最后一次出现后的字符串

C# 获取字符/字符串最后一次出现后的字符串,c#,regex,string,linq,C#,Regex,String,Linq,我有一个不寻常的项目,在该项目中,我需要在字符\的第二次最后出现之后检索文本,有效地在以下示例字符串中为我提供了最后两个目录: D:\Archive Directory\2015-12-31 PM\SerialNo\u 01 D:\Archive Directory\2016-01-01\SerialNo\u 02 D:\Archive Directory\2016年1月\SerialNo\u 03 预期结果分别为: 2015年12月31日下午 2016-01-01\SerialNo\u 02

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

D:\Archive Directory\2015-12-31 PM\SerialNo\u 01 D:\Archive Directory\2016-01-01\SerialNo\u 02 D:\Archive Directory\2016年1月\SerialNo\u 03 预期结果分别为:

2015年12月31日下午 2016-01-01\SerialNo\u 02 2016年1月\SerialNo\u 03 我希望尽可能干净地完成这项工作,最好是为每个字符串编写一行代码

在堆栈溢出中找不到关于查找c中字符串或字符串中的字符的第二个或最后一个匹配项的任何内容后,我回答了这个问题。如果社区发现这个问题是重复的,或者觉得这个问题太模糊,我愿意删除它


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

在修改了源代码后,我找到了一个解决方案


这将在每个反斜杠处拆分字符串,然后反转生成的字符串数组,并在将最后两个元素重新连接在一起之前仅取最后两个元素,现在按相反顺序进行操作,以获得所需的结果。

您还可以匹配所需的部分

(?<=\\)[^\\]*\\[^\\]*$
见演示


您不需要正则表达式,可以依赖.NET提供的内置路径处理

这样,您就不必担心边缘情况,甚至不必担心跨操作系统的兼容性

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

对于多个结果,如果对regex感兴趣,请使用Matches而不是match

,使用gm标志。这是一种非常浪费的获取子字符串的方法。。。常规LastIndexOf速度更快,并且在处理过程中不会产生数量惊人的字符串/对象。同意-这是我尝试的第一件事,但我不是在寻找反斜杠的最后一个索引,而是在寻找它的第二个索引。你能告诉我你将如何使用LastIndexOf来做这件事吗?我会在上发帖提问,问是否有LastIndexOf可以从给定的位置开始向后搜索。。。也许有人会为我搜索MSDN并给出答案。然后查找答案,如向前搜索和复制粘贴。如果SerialNo\u 0x部分是目录而不是文件,这仍然有效吗?由于某些原因,即使我将Path.getfilename更改为Path.GetDirectoryNames,也无法编译该文件;我在对s的两个引用上都遇到了无法将字符转换为字符串的错误。我将每个路径单独使用,而不是作为逗号分隔的列表,但我认为这不会是问题所在?它不知道是目录还是文件,但上述两种方法都适用。错误是因为您可能将输入用作字符串,而不是字符串列表。明白了。我把它改为简单的var result=Path.CombineDirectory.GetParentmyString.Name,Path.getfilenameystring;它工作得非常完美,比我以前的解决方案更具可读性!谢谢
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()));
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 
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
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()));