【问题标题】:Extracting string between two characters?提取两个字符之间的字符串?
【发布时间】:2012-08-24 11:30:21
【问题描述】:

我想提取< >之间的电子邮件ID

例如。

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

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

【问题讨论】:

  • 是;多个匹配的分隔符还是必须从输入字符串中匹配?
  • @Rawling 这个问题是指在此处仅在两个括号之间提取字符串我有多个 ;
  • 你说从 中提取电子邮件,但是“;”在括号之外。这就是我问的原因。
  • @Vis - 以下答案都不适合您吗?

标签: c# .net string visual-studio-2010


【解决方案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>;", '<', '>')

你会得到

abc@gmail.com

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
【解决方案2】:
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】:

测试过

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】:

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

    编写一个循环,只要找到另一个&lt; 字符就会重复,每次找到&lt; 字符时,查找下一个&gt; 字符。使用String.Substring(int, int) method 提取您知道其开始和结束位置的电子邮件地址。

    【讨论】:

    • -1?任何原因?如果答案有任何不正确之处,请告诉我,以便我改进。
    • 如果您可以客观地突出此答案中的任何错误,这些错误会导致反复投反对票,请随时这样做。我也渴望了解更多:-)
    【解决方案5】:

    可以使用以下正则表达式和一些 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】:
      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();
              }
      

      【讨论】:

      • 答案应该有一个解释,而不仅仅是一些用于盲目复制和粘贴的代码......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2020-10-15
      • 2014-02-26
      • 1970-01-01
      • 2013-01-31
      • 2013-12-11
      • 2015-05-04
      相关资源
      最近更新 更多