Suchen Sie einen bestimmten Text und die entsprechende E-Mail-ID aus der Mitte einer Zeichenfolge und speichern Sie sie in der Datentabelle oder in der Liste in C #

Nov 23 2020

Ich habe eine Zeichenfolge wie unten

string error_message= "{\"2705\":\"Error importing username: 3167763, primary email: [email protected], error: User already exists but Email does not match: [email protected] vs [email protected]\",\"10001\":\"Error importing username: 3195330, primary email: [email protected], error: User already exists but Email does not match: [email protected] vs [email protected]\"}";

Aus der obigen Zeichenfolge muss ich den sich wiederholenden Text "Fehler beim Importieren des Benutzernamens:" finden und den Wert für den Benutzernamen daneben zusammen mit der entsprechenden E-Mail-ID nach dem Text "primäre E-Mail:" verwenden und in der Datentabelle mit der erwarteten Ausgabe wie unten speichern

Erwartetes Ergebnis in Datatable wie unten

username    primary email
3167763     [email protected]
3195330     [email protected]

Unten ist das Codebeispiel, das ich habe, wo ich alle Benutzernamen in der Liste erhalten kann. Ich muss den folgenden Code ändern, um sowohl den Benutzernamen als auch die entsprechende primäre E-Mail-ID sowie eine Sammlung zu erhalten. Ihre Hilfe wird sehr nützlich sein

List<int> list = Regex.Matches(error_message, @"(?<=Error importing username: )\d+")
    .Cast<Match>()
    .Select(match => int.Parse(match.Value))
    .ToList();

Antworten

JohnathanBarclay Nov 23 2020 at 10:06

Sie können ein Wörterbuch mit dem Benutzernamen als Schlüssel und der E-Mail-Adresse als Wert erstellen:

string pattern = @"Error importing username: (\d+), primary email: ([^,]+)";
var dict = Regex.Matches(error_message, pattern)
    .Cast<Match>()
    .ToDictionary(match => match.Groups[1], match => match.Groups[2]);

Das Muster enthält 2 Erfassungsgruppen, die in Klammern angegeben sind und zum Extrahieren des Benutzernamens und der E-Mail-Adresse aus jeder Übereinstimmung verwendet werden können.

Das E-Mail-Muster [^,]+stimmt einfach mit einem oder mehreren Zeichen überein, die kein Komma sind. Es werden keine gültigen E-Mail-Adressen sichergestellt.

Wenn dies erforderlich ist, finden Sie hier weitere Details .

Arbeitsbeispiel

Thefourthbird Nov 23 2020 at 10:10

Anstatt ein einzelnes Lookbehind zu verwenden, können Sie zwei Erfassungsgruppen verwenden.

\bError importing username: (\d+), primary email: ([^\s@]+@[^\s@,]+)

Regex-Demo | C # -Demo

Zum Beispiel

string pattern = @"\bError importing username: (\d+), primary email: ([^\s@]+@[^\s@,]+)";
string input = @"string error_message= ""{\""2705\"":\""Error importing username: 3167763, primary email: [email protected], error: User already exists but Email does not match: [email protected] vs [email protected]\"",\""10001\"":\""Error importing username: 3195330, primary email: [email protected], error: User already exists but Email does not match: [email protected] vs [email protected]\""}"";";

var collection = Regex.Matches(input, pattern)
.Cast<Match>()
.Select(match => 
new {username = int.Parse(match.Groups[1].Value), primary_email = match.Groups[2].Value}
);

foreach (var item in collection) {
    Console.WriteLine("username: {0}, primary email: {1}", 
    item.username, 
    item.primary_email
    );
}

Ausgabe

username: 3167763, primary email: [email protected]
username: 3195330, primary email: [email protected]