如何在C#中将子字符串从一个定界符提取到另一个定界符?

时间:2018-07-30 06:24:35

标签: c#

我的输入将如下所示: abc @ gmail.com,def @ yahoo.com; xyz@gmail.com; ghi@hotmail.com等

现在,我希望输出为: abc 定义 y 吉

以下是我的代码:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main(string[] args)
    {
        string str;
        string[] newstr,newstr2;
        Console.WriteLine("Enter the email addresses: ");
        str=Console.ReadLine();
        newstr=Regex.Split(str,",|;|@");
        foreach (string s in newstr)
        {
            Console.WriteLine(s);
        }
    }
}

我现在的输出是: abc gmail.com 定义 yahoo.com y gmail.com 吉 hotmail.com

任何帮助将不胜感激。谢谢。

6 个答案:

答案 0 :(得分:4)

您不应使用正则表达式进行拆分,也不应使用@进行拆分。相反,请使用以下代码:

using System;

public class Program
{
    public static void Main(string[] args)
    {
        string str;
        string[] newstr;
        Console.WriteLine("Enter the email addresses: ");
        str = Console.ReadLine();
        newstr = str.Split(new char[] { ',', ';' }); // Split to get a temporal array of addresses 
        foreach (string s in newstr)
        {
            Console.WriteLine(s.Substring(0, s.IndexOf('@'))); // Extract the sender from the email addresses
        }
    }
}

编辑:

或者,使用LINQ:

using System;
using System.Linq;

public class Program
{
    public static void Main(string[] args)
    {
        string str;
        string[] newstr;
        Console.WriteLine("Enter the email addresses: ");
        str = Console.ReadLine();
        newstr = str.Split(new char[] { ',', ';' })  // Split to get a array of addresses to work with
            .Select(s => s.Substring(0, s.IndexOf('@'))).ToArray(); // Extract the sender from the email addresses
        foreach (string s in newstr)
        {
            Console.WriteLine(s);
        }
    }
}

答案 1 :(得分:3)

没有RegEx的另一种方法

string input = "abc@gmail.com,def@yahoo.com;xy@gmail.com; ghi@hotmail.com";
var result = input.Split(',', ';').Select(x => x.Split('@').First());

首先以Split,的地址;,然后通过再次拆分来选择@之前的部分。

答案 2 :(得分:0)

您可以使用此电子邮件正则表达式:

            var regex = new Regex(@"(?<name>\w+([-+.']\w+)*)@\w+([-.]\w+)*\.\w+([-.]\w+)*");

            var results =
            regex.Matches("abc@gmail.com,def@yahoo.com;xyz@gmail.com;ghi@hotmail.com")
                .Cast<Match>()
                .Select(m => m.Groups["name"].Value)
                .ToList();

答案 3 :(得分:0)

也许使用此方法可能会有所帮助

str.Substring(0, str.LastIndexOf(" ")<0?0:str.LastIndexOf(" "));

答案 4 :(得分:0)

由于Mail是具有复杂定义的怪异事物,因此我永远不会假设带有@的东西就是邮件。
我最好的方法是将字符串转换为MailAddress,以防万一它看起来像一封邮件,但由于某些无效的char等原因,它不是一个。

string input = "abc@gmail.com,ghi@hotmail.com;notme; @op this is not a mail!";
var result = input
                .Split(',', ';')    // Split
                .Select(x =>
                {
                    string adr = "";
                    try
                    {   // Create an MailAddress, MailAddress has no TryParse.
                        adr = new MailAddress(x).User;
                    }
                    catch
                    {
                        return new { isValid = false, mail = adr };
                    }
                    return new { isValid = true, mail = adr };
                })
                .Where(x => x.isValid)
                .Select(x => x.mail);

答案 5 :(得分:0)

实际上,在正则表达式中,要捕获一些子字符串,您需要使用()来包装期望的内容

下面的代码应该可以工作

string str22 = "abc@gmail.com;def@yahoo.com,xyz@gmail.com;fah@yao.com,h347.2162@yahoo.com.hk";// ghi@hotmail.com";
List<string> ret = new List<string>();
string regExp = @"(.*?)@.*?[,;]{1}|(.*)@";
MatchCollection matches = Regex.Matches(str22, regExp, RegexOptions.IgnoreCase);
foreach (Match match in matches)
{
    if (match.Success)
    {
        int pvt = 1;
        while (string.IsNullOrEmpty(match.Groups[pvt].Value))
        {
            pvt++;
        }
        MessageBox.Show(match.Groups[pvt].Value);
    }
}
return;

正则表达式如下

  (.*?)@.*?[,;]{1}|(.*)@

(.*?)@.*?[,;]{1}在@之前获取子字符串,而?限制其获取第一个匹配项。

最后一封电子邮件不包含,;,因此添加OR条件并通过@之前的子字符串获取最后一封电子邮件名称