我找到了this question,它实现了我想要的东西,但是我只有一个问题:子串的“开始”和“结束”是相同的字符。
我的字符串是:
.0.label unicode "Area - 110"
我想在引号之间提取文本(“Area - 110”)。
在链接的问题中,答案都使用特定标识符和IndexOf
解决方案。问题是,如果我这样做,IndexOf
可能会返回相同的值。
此外,如果我使用Split
方法,我想要保留的文本不是固定长度 - 它可以是一个单词,可以是七个;所以我也有问题指定该集合中第一个和最后一个单词的索引。
答案 0 :(得分:2)
问题在于,如果我这样做,
IndexOf
可能会返回相同的值。
这种情况下的一个常见技巧是使用LastIndexOf
来查找结束双引号的位置:
int start = str.IndexOf('"');
int end = str.LastIndexOf('"');
if (start >= 0 && end > start) {
// We have two separate locations
Console.WriteLine(str.Substring(start+1, end-start-1));
}
答案 1 :(得分:0)
我想这样:
string str = ".0.label unicode \"Area - 110\"";
str = input.SubString(input.IndexOf("\"") + 1);
str = input.SubString(0, input.IndexOf("\""));
事实上,这是我最常用的辅助方法/扩展之一,因为它非常通用:
/// <summary>
/// Isolates the text in between the parameters, exclusively, using invariant, case-sensitive comparison.
/// Both parameters may be null to skip either step. If specified but not found, a FormatException is thrown.
/// </summary>
public static string Isolate(this string str, string entryString, string exitString)
{
if (!string.IsNullOrEmpty(entryString))
{
int entry = str.IndexOf(entryString, StringComparison.InvariantCulture);
if (entry == -1) throw new FormatException($"String.Isolate failed: \"{entryString}\" not found in string \"{str.Truncate(80)}\".");
str = str.Substring(entry + entryString.Length);
}
if (!string.IsNullOrEmpty(exitString))
{
int exit = str.IndexOf(exitString, StringComparison.InvariantCulture);
if (exit == -1) throw new FormatException($"String.Isolate failed: \"{exitString}\" not found in string \"{str.Truncate(80)}\".");
str = str.Substring(0, exit);
}
return str;
}
你会这样使用:
string str = ".0.label unicode \"Area - 110\"";
string output = str.Isolate("\"", "\"");