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 #
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
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
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]