我想提取在
例如:
输入字符串:
< >
之间的电子邮件地址。例如:
输入字符串:
"abc" <abc@gmail.com>; "pqr" <pqr@gmail.com>;
输出字符串:abc@gmail.com;pqr@gmail.com
< >
之间的电子邮件地址。"abc" <abc@gmail.com>; "pqr" <pqr@gmail.com>;
输出字符串:abc@gmail.com;pqr@gmail.com
没有正则表达式,您可以使用以下内容:
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>;", '<', '>')
你会得到
abc@gmail.com
string input = @"""abc"" <abc@gmail.com>; ""pqr"" <pqr@gmail.com>;";
var output = String.Join(";", Regex.Matches(input, @"\<(.+?)\>")
.Cast<Match>()
.Select(m => m.Groups[1].Value));
已测试
string input = "\"abc\" <abc@gmail.com>; \"pqr\" <pqr@gmail.com>;";
matchedValuesConcatenated = string.Join(";",
Regex.Matches(input, @"(?<=<)([^>]+)(?=>)")
.Cast<Match>()
.Select(m => m.Value));
(?<=<) 是一种非捕获的反向预查,因此 < 是搜索的一部分,但不包含在输出中。
捕获组是任何不是 > 的东西,出现一次或多次
也可以使用非捕获组 @"(?:<)([^>]+)(?:>)"
LB +1 的答案也是正确的。我只是在自己回答之前没有意识到它是正确的。
String.IndexOf(char, int)
方法在给定索引处搜索以<
开头的字符串(例如,您上次找到>
字符的最后索引,即上一个电子邮件地址的末尾 - 或者在查找第一个地址时为0
)。<
字符,就重复此操作,并且每次找到<
字符时,都会查找下一个>
字符。使用String.Substring(int, int)
方法提取您已知起始和结束位置的电子邮件地址。可以使用以下正则表达式和一些 LINQ。
var regex = new Regex(@"\<(.*?)\>");
var input= @"""abc"" <abc@gmail.com>; ""pqr"" <pqr@gmail.com>";
var matches = regex.Matches(input);
var res = string.Join(";", matches.Cast<Match>().Select(x => x.Value.Replace("<","").Replace(">","")).ToArray());
尖括号<>在之后会被移除,你也可以将其整合到Regex
中。
string str = "\"abc\" <abc@gmail.com>; \"pqr\" <pqr@gmail.com>;";
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();
}