2016-09-13 1 views
0

Ich habe String wieWie ersetzen mit regulären Ausdrücken über C#

„Vorname = Alpha & Name = Beta & [email protected] & Land = Unitedstates & [email protected] "

Ich brauche etwas Hilfe mit dem regulären Ausdruck mit extrahiert den E-Mail-Wert.

Ich habe das Muster "Email = (. *?) &" verwendet, aber es braucht eine & am Ende der Zeichenfolge.

Mein Code, um den E-Mail-Wert

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

Jede Hilfe mit Regex ersetzen?

+0

Sie haben zwei verschiedene E-Mails im Beispiel String. Wonach versuchst du sie zu ersetzen? –

+0

Ich möchte die E-Mail durch einen Text wie "etwas" ersetzen –

Antwort

4

Strings in .NET sind Invariante unveränderlich, und the input parameter to this overload of Regex.Replace is not a ref parameter. Stattdessen wird die geänderte Zeichenfolge von Regex.Replace zurückgegeben. zuweisen einfach:

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

Ich gehe davon aus (obwohl wir alle wissen, welche Auswirkungen das auf u und mir hat), dass ComputeReplacement ein MatchEvaluator ist.

+1

Ich werde ein unerträglicher Pedant sein und darauf hinweisen, dass Strings * unveränderlich * sind. Invariant bezieht sich normalerweise auf Generika (Invariante ist das, was man erhält, wenn etwas weder kovariant noch kontravariant ist). – Kyle

+1

@Kyle Danke. Ich habe eine Art seltsamer Aphasie mit diesem Wort. Deine Pedanterie ist völlig erträglich. –

+0

Meine Frage hätte klarer sein müssen. Der angegebene Code funktioniert nicht für die Eingabezeichenfolge, da das zweite Vorkommen von E-Mails nicht mit einer Zeichenfolge endet. Brauchen Sie Hilfe mit Regex und dann muss ich alle E-Mail-Werte durch einen berechneten Wert wie email.Length ersetzen. –

3

Vielleicht könnten Sie einen Blick in die HttpUtility.ParseQueryString Methode nehmen, da es die gleiche Aufgabe ohne den regulären Ausdruck verarbeiten kann:

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); 
} 

Dieser Ansatz kümmert sich auch um die URL-Codierung; zum Beispiel versuchen, mit "FirstName=Some%20Name"

+0

Es wird nicht mit den beiden "Email" -Werte helfen, glaube ich nicht ... –

+0

@ JeremyHolovacs, du hast Recht, behoben –

0

Sie den folgenden Code verwenden, um die E-Mails zu erhalten:

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

wenn Sie die Zeichenfolge aufgeteilt, bevor Sie Ihren Regex verwenden, gibt es keine Notwendigkeit mehr für eine & am Ende die Zeichenfolge (Sie werden mit einem zusätzlichen & am Ende des resultierenden Strings am Ende, aber man kann das überprüfen, ob es ein Problem ist):

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) + "&"; } 
Verwandte Themen