2016-09-13 29 views
0

我有串状如何通过C#使用正则表达式来代替

“姓=阿尔法&名字=测试版& [email protected] &国家= UnitedStates的& [email protected]

我需要一些正则表达式的帮助来提取电子邮件的值。

我使用了模式“Email =(。*?)&”,但它需要在字符串末尾有一个&。

我的代码来代替电子邮件值

Regex.Replace(text, "email=(.*?)&", ComputeReplacement, RegexOptions.IgnoreCase); 

用正则表达式的任何帮助吗?

+0

您在本例中字符串两个不同的电子邮件。你想用什么替换它们? –

+0

我想用“东西”这样的文本替换电子邮件 –

回答

4

.NET中的字符串是不变的不可变,而the input parameter to this overload of Regex.Replace is not a ref parameter。相反,更改后的字符串将由Regex.Replace返回。简单地给它分配:

text = Regex.Replace(text, "email=(.*?)&", ComputeReplacement, RegexOptions.IgnoreCase); 

我假设(尽管我们都知道,有什么样的影响对U和我)ComputeReplacementMatchEvaluator

+1

我将成为一个难以忍受的迂腐者,并指出字符串*是不可变的*。不变式通常指的是泛型(不变量就是当某件事物既不是协变又不是逆变时所得到的)。 – Kyle

+1

@凯尔谢谢。那个词我有一种奇怪的失语症。你的脚步完全可以忍受。 –

+0

我的问题应该更清楚。给定的代码不适用于输入字符串,因为第二次出现的电子邮件不以字符串结尾。需要正则表达式的帮助,然后我需要用email.Length这样的计算值替换所有的电子邮件值。 –

3

也许你可以看看到HttpUtility.ParseQueryString方法,因为它可以处理相同的任务,而不正则表达式:

var query = "FirstName=Alpha&LastName=Beta&[email protected]&[email protected]"; 
var parsed = HttpUtility.ParseQueryString(query); 
foreach (var email in parsed.GetValues("Email")) 
{ 
    Console.WriteLine(email); 
} 

这种方法也需要照顾的URL编码的;例如,尝试用"FirstName=Some%20Name"

+0

它不会帮助两个“电子邮件”值,我不认为... –

+0

@JeremyHolovacs,你是对的,修复 –

0

您可以使用下面的代码来获取电子邮件:

string input = "FirstName=Alpha&LastName=Beta&[email protected]&Country=UnitedStates&[email protected]"; 
Dictionary<string,string> emails = input.Split(new char[] { '&' }).Where(param => param.ToLower().Contains("email")).Select(param => param.Split(new char[] { '=' })).ToDictionary(x=> x[1], x=> x[0]); 
foreach (string email in emails.Keys) 
{ 
    Console.WriteLine(email); 
} 
0

如果您在使用正则表达式之前分割字符串,就没有必要再为&在年底字符串(你最终会与所得到的字符串末尾一个额外的&,但你可以检查,如果它是一个问题):

String input = "FirstName=Alpha&LastName=Beta&[email protected]&Country=UnitedStates&[email protected]"; 
String output = ""; 
foreach (string element in input.Split('&')) { 
    output += Regex.Replace(element, "email=(.*?)&", ComputeReplacement, RegexOptions.IgnoreCase) + "&"; }