获取字符/字符串倒数第二次出现之后的字符串
本文关键字:字符串 之后 第二次 倒数第二 字符 倒数 获取 | 更新日期: 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()));