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

8
我想提取在< >之间的电子邮件地址。
例如:
输入字符串:"abc" <abc@gmail.com>; "pqr" <pqr@gmail.com>; 输出字符串:abc@gmail.com;pqr@gmail.com

是分隔符还是必须从输入字符串中匹配多个结果? - Alex
@Rawling 那个问题是指仅提取两个括号之间的字符串,而这里我有多个< >; - Vishwanath Dalvi
2
你说要从<>中提取电子邮件,但是";"在括号外面。这就是我问的原因。 - Alex
1
@Vis - 以下的答案都不适用于您吗? - Sandeep
显示剩余3条评论
6个回答

11

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

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


虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Donald Duck

7
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));

在这里,使用正则表达式将是主要的解决方案。 - Ivan Reznikov

3

已测试

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

(?<=<) 是一种非捕获的反向预查,因此 < 是搜索的一部分,但不包含在输出中。

捕获组是任何不是 > 的东西,出现一次或多次

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

LB +1 的答案也是正确的。我只是在自己回答之前没有意识到它是正确的。


2
使用String.IndexOf(char, int)方法在给定索引处搜索以<开头的字符串(例如,您上次找到>字符的最后索引,即上一个电子邮件地址的末尾 - 或者在查找第一个地址时为0)。
编写循环,只要找到另一个<字符,就重复此操作,并且每次找到<字符时,都会查找下一个>字符。使用String.Substring(int, int)方法提取您已知起始和结束位置的电子邮件地址。

-1?有任何原因吗?如果答案有误,请告诉我,以便我改进它。 - O. R. Mapper
如果您能客观地指出这个答案中任何错误,这些错误足以引起反复的负评,请随时这样做。我也很渴望学到更多 :-) - O. R. Mapper

0

可以使用以下正则表达式和一些 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中。


-2
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();
        }

3
答案应该有解释,而不仅仅是一些代码供机械地复制和粘贴。 - O. R. Mapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接