代码之家  ›  专栏  ›  技术社区  ›  Rob

c#如何在开始/结束分隔符中高效地查找多个字符串[重复]

  •  0
  • Rob  · 技术社区  · 6 年前

    我想提取电子邮件id < >

    例如。

    输入字符串: "abc" <abc@gmail.com>; "pqr" <pqr@gmail.com>;

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

    0 回复  |  直到 14 年前
        1
  •  11
  •   Franco Dipre    9 年前

    没有正则表达式,你可以使用这个:

    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

        2
  •  7
  •   L.B    14 年前
    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));
    
        3
  •  3
  •   paparazzo    14 年前

    已测试

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

    (?<=<)是一种非捕捉式的视角,因此<是搜索的一部分,但不包含在输出中

    捕获组不是>一次或多次

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

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

        4
  •  2
  •   O. R. Mapper    14 年前

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

    写一个循环,只要你找到另一个循环就重复一次 < 性格,每次你发现 < 角色,寻找下一个 > 性格。使用 String.Substring(int, int) method 提取您知道其开始和结束位置的电子邮件地址。

        5
  •  0
  •   Alex    14 年前

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

        6
  •  -2
  •   Pankaj Agarwal    14 年前
    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();
            }