基于两个位置中的相同标识符提取子字符串

时间:2018-05-24 00:50:05

标签: c# .net string

我找到了this question,它实现了我想要的东西,但是我只有一个问题:子串的“开始”和“结束”是相同的字符。

我的字符串是:

.0.label unicode "Area - 110"

我想在引号之间提取文本(“Area - 110”)。

在链接的问题中,答案都使用特定标识符和IndexOf解决方案。问题是,如果我这样做,IndexOf可能会返回相同的值。

此外,如果我使用Split方法,我想要保留的文本不是固定长度 - 它可以是一个单词,可以是七个;所以我也有问题指定该集合中第一个和最后一个单词的索引。

2 个答案:

答案 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));
}

Demo.

答案 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("\"", "\"");