2016-09-13 45 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) + "&"; }