我的输入将如下所示: 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
任何帮助将不胜感激。谢谢。
答案 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条件并通过@
之前的子字符串获取最后一封电子邮件名称