簡體   English   中英

如何從字符串中獲取字符串,以特定字符串開頭和結尾

[英]How to get a string from a string, starting and ending with a specific string

我有一個包含類似下面的文本的字符串

Name: John\n Surname: Smith\n Address: XXX\n

它可以以不同的順序出現。

我想獲取名稱值,姓氏值和地址值。

因此,問題是:如何獲取從字符串“ Name:”開始並在“ \\ n”之前結束的字符串,這樣我得到“ John”,並且代碼可讀性強?

我嘗試使用Substring函數,但是它需要對字符串進行修改,以便獲得“ \\ n”部分的正確索引。 而且,我不希望修改原始字符串,以使其更具可讀性。

您可以將此字符串轉換為字典(即一組鍵值對)。 首先用換行符將初始字符串分割成字符串數組。 然后,此數組中的每個字符串均按冒號分為兩部分-鍵和值:

var input = "Name: John\n Surname: Smith\n Address: XXX\n";
var dictionary = input.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
                      .Select(s => s.Split(':'))
                      .ToDictionary(p => p[0].Trim(), p => p[1].Trim());

然后通過其鍵讀取值:

var name = dictionary["Name"]; // gives you John

注意:如果地址或其他字段允許包含冒號,則可以在選擇字典值時使用@Joel Coehoorn注釋中的string.Join選項。

或者,您可以使用正則表達式來代替拆分和連接字符串。 只需在輸入中找到模式匹配項即可:

var input = "Name: John\n Surname: Sm:ith\n Address: XX:X\n";
var dictionary = Regex.Matches(input, @"\s*([^:]+): ([^\n]+)\n").Cast<Match>()
                      .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);
var address = dictionary["Address"]; // XX:X

我會在這種情況下使用Regex原因有兩個:

  1. 在這些情況下,更容易進行維護。 當函數的作用增加時, SubstringSplitIndexof容易卷積。
  2. 它為將來的變化提供了更大的靈活性

下面是解析它的代碼:

static string ExtractParam(string input, string arg) {
    var match = Regex.Match(input, $@"\b{arg}:\s*(.*?)\n");
    return match.Success ? match.Groups[1].Value : null;
}

static void Main() {
    var input = "Name: John\n Surname: Smith\n Address: XXX\n";

    var name = ExtractParam(input, "Name");
    var surname = ExtractParam(input, "Surname");
    var address = ExtractParam(input, "Address");

    Console.WriteLine($"Name: {name}\n Surname: {surname}\n Address: {address}\n");
}

正則表達式很容易理解。

\b   : Match a word boundary
\s*  : Eat up any unwanted whitespace
.*?  : Match any string in a non-greedy way
()   : Parenthesis are used to capture what we want to return

@Vikhram的回答真的很好:)

我會給你其他想法。 我的程序的工作方式略有不同,它找到字符串包含“ n”的所有索引 ,這將把字符串從最后一個“ \\ n”打印到“ \\ n”

        string test = "Name: John\n Surname: Smith\n Address: XXX\n";

        int fst_index = test.IndexOf("\n");
        int snd_index = test.IndexOf("\n", fst_index+1);
        int trd_index = test.IndexOf("\n", snd_index+1);

        Console.WriteLine(test.Substring(fst_index, snd_index-fst_index));
        Console.WriteLine("SPACE ?");

        Console.WriteLine(test.Substring(snd_index, trd_index - snd_index));
        Console.WriteLine("SPACE ?");

如果要在長文本中使用它,則必須使用循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM