获取任意位置的两个分隔符之间的子字符串
本文关键字:分隔符 两个 之间 字符串 任意 位置 获取 | 更新日期: 2023-09-27 17:55:37
我有以下字符串:
string source = "Test/Company/Business/Department/Logs.tvs/v1";
/
字符是字符串中各种元素之间的分隔符。我需要获取字符串的最后两个元素。为此,我有以下代码。这工作正常。有没有更快/更简单的代码?
法典
static void Main()
{
string component = String.Empty;
string version = String.Empty;
string source = "Test/Company/Business/Department/Logs.tvs/v1";
if (!String.IsNullOrEmpty(source))
{
String[] partsOfSource = source.Split('/');
if (partsOfSource != null)
{
if (partsOfSource.Length > 2)
{
component = partsOfSource[partsOfSource.Length - 2];
}
if (partsOfSource.Length > 1)
{
version = partsOfSource[partsOfSource.Length - 1];
}
}
}
Console.WriteLine(component);
Console.WriteLine(version);
Console.Read();
}
为什么没有正则表达式?这个相当容易:
.*/(?<component>.*)/(?<version>.*)$
您甚至可以标记您的组,因此对于您的匹配,您需要做的就是:
component = myMatch.Groups["component"];
version = myMatch.Groups["version"];
以下内容应该更快,因为它只扫描查找两个/
所需的字符串,并且不会费心拆分整个字符串:
string component = "";
string version = "";
string source = "Test/Company/Business/Department/Logs.tvs/v1";
int last = source.LastIndexOf('/');
if (last != -1)
{
int penultimate = source.LastIndexOf('/', last - 1);
version = source.Substring(last + 1);
component = source.Substring(penultimate + 1, last - penultimate - 1);
}
也就是说,与所有性能问题一样:配置文件!将两者与一大堆现实生活中的输入并排尝试,看看哪个最快。
(此外,如果输入中没有斜杠,这将留下空字符串而不是引发异常......但是如果source
为空,请扔掉,懒惰我。
鉴于您正在寻找特定索引的子字符串,您的方法是最合适的方法。在这种情况下,执行相同操作的 LINQ 表达式可能不会改善代码或其可读性。
作为参考,此处提供了一些来自Microsoft的有关使用字符串和 LINQ 的重要信息。特别是请参阅此处的文章,其中介绍了 LINQ 和 RegEx 的一些示例。
编辑: +1 对于正则表达式方法中马特的命名组...这是我见过的最好的解决方案。
你的代码看起来很多都很好。需要注意的几点:
-
String.Split()
永远不会返回 null,因此您不需要对其进行 null 检查。 -
如果(原始帖子已更新以解决此问题)source
字符串少于两个/
字符,您将如何处理? - 如果源字符串为 null 或为空(或无效),您真的只想输出空字符串吗?如果您对输入的性质有特定的期望,则可能需要考虑在未满足这些期望时快速失败。
你可以尝试这样的事情,但我怀疑它会更快。你可以用System.Diagnostics.StopWatch做一些测量,看看你是否觉得有必要。
string source = "Test/Company/Business/Department/Logs.tvs/v1";
int index1 = source.LastIndexOf('/');
string last = source.Substring(index1 + 1);
string substring = source.Substring(0, index1);
int index2 = substring.LastIndexOf('/');
string secondLast = substring.Substring(index2 + 1);
我会尝试
string source = "Test/Company/Business/Department/Logs.tvs/v1";
var components = source.Split('/').Reverse().Take(2);
String last = string.Empty;
var enumerable = components as string[] ?? components.ToArray();
if (enumerable.Count() == 2)
last = enumerable.FirstOrDefault();
var secondLast = enumerable.LastOrDefault();
希望这会有所帮助
您可以使用以下过程检索最后两个单词:
string source = "Test/Company/Business/Department/Logs.tvs/v1";
String[] partsOfSource = source.Split('/');
if(partsOfSourch.length>2)
for(int i=partsOfSourch.length-2;i<=partsOfSource.length-1;i++)
console.writeline(partsOfSource[i]);