![](/img/trans.png)
[英]How to get string between starting text and ending character using regular expression?
[英]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
原因有兩個:
Substring
, Split
, Indexof
容易卷積。 下面是解析它的代碼:
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.