在两个字符之间提取字符串?

我想在之间提取电子邮件ID

例如。

输入字符串: "abc" ; "pqr" ; "abc" ; "pqr" ;

输出字符串: abc@gmail.com;pqr@gmail.com

 string input = @"""abc"" ; ""pqr"" ;"; var output = String.Join(";", Regex.Matches(input, @"\<(.+?)\>") .Cast() .Select(m => m.Groups[1].Value)); 

经测试

 string input = "\"abc\" ; \"pqr\" ;"; matchedValuesConcatenated = string.Join(";", Regex.Matches(input, @"(?<=<)([^>]+)(?=>)") .Cast() .Select(m => m.Value)); 

(?<= <)是一个非捕获的背后,所以<是搜索的一部分,但不包含在输出中

捕获组不是>一次或多次

也可以使用非捕获组@“(?:<)([^>] +)(?:>)”

LB +1的答案也是正确的。 直到我自己写了一个答案,我才意识到它是正确的。

没有正则表达式,您可以使用:

 public static string GetStringBetweenCharacters(string input, char charFrom, char charTo) { int posFrom = input.IndexOf(charFrom); if (posFrom != -1) //if found char { int posTo = input.IndexOf(charTo, posFrom + 1); if (posTo != -1) //if found char { return input.Substring(posFrom + 1, posTo - posFrom - 1); } } return string.Empty; } 

然后:

GetStringBetweenCharacters("\"abc\" ;", '<', '>')

你会得到

abc@gmail.com

使用String.IndexOf(char, int)方法搜索<从字符串中给定索引开始(例如,您找到>字符的最后一个索引,即在上一个电子邮件地址的末尾 - 或0在寻找第一个地址时)。

只要找到另一个<字符,就写一个循环重复,每次找到<字符时,查找下一个>字符。 使用String.Substring(int, int)方法提取当前已知其开始和结束位置的电子邮件地址。

可以使用以下正则表达式和一些linq。

  var regex = new Regex(@"\<(.*?)\>"); var input= @"""abc"" ; ""pqr"" "; var matches = regex.Matches(input); var res = string.Join(";", matches.Cast().Select(x => x.Value.Replace("<","").Replace(">","")).ToArray()); 

之后<\ n>括号被移除,我猜也可以将它集成到Regex

 string str = "\"abc\" ; \"pqr\" ;"; string output = string.Empty; while (str != string.Empty) { output += str.Substring(str.IndexOf("<") + 1, str.IndexOf(">") -1); str = str.Substring(str.IndexOf(">") + 2, str.Length - str.IndexOf(">") - 2).Trim(); }