Znajdź określony tekst i odpowiadający mu identyfikator e-mail ze środka ciągu i zapisz go w formacie datatable lub na liście w C #

Nov 23 2020

Mam ciąg jak poniżej

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]\"}";

z powyższego ciągu muszę znaleźć powtarzający się tekst „Błąd podczas importowania nazwy użytkownika:” i wziąć obok niego wartość nazwy użytkownika wraz z odpowiednim identyfikatorem e-mail po tekście „podstawowy adres e-mail:” i zapisać go w formacie datatable z oczekiwanymi wynikami, jak poniżej

Oczekiwany wynik w Datatable, jak poniżej

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

poniżej znajduje się przykładowy kod, który mam, gdzie mogę uzyskać całą nazwę użytkownika z listy Muszę zmodyfikować poniższy kod, aby uzyskać zarówno nazwę użytkownika, jak i odpowiadający jej podstawowy identyfikator e-mail, a także w kolekcji Twoja pomoc będzie bardzo przydatna

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

Odpowiedzi

JohnathanBarclay Nov 23 2020 at 10:06

Możesz utworzyć słownik z nazwą użytkownika jako kluczem i adresem e-mail jako wartością:

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

Wzorzec zawiera 2 grupy przechwytywania, oznaczone nawiasami, których można użyć do wyodrębnienia nazwy użytkownika i adresu e-mail z każdego dopasowania.

Wzorzec wiadomości e-mail [^,]+po prostu dopasowuje jeden lub więcej znaków, które nie są przecinkami; nie zapewnia prawidłowych adresów e-mail.

Jeśli jest to wymagane, więcej szczegółów można znaleźć tutaj .

Przykład roboczy

Thefourthbird Nov 23 2020 at 10:10

Zamiast używać pojedynczego lookbehind, możesz użyć 2 grup przechwytywania.

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

Demo Regex | C # demo

Na przykład

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

Wynik

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