Recherchez le texte spécifique et l'ID de courrier électronique correspondant au milieu d'une chaîne et stockez-le dans une table de données ou dans une liste en C #
J'ai une chaîne comme ci-dessous
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]\"}";
à partir de la chaîne ci-dessus, j'ai besoin de trouver le texte répété "Erreur lors de l'importation du nom d'utilisateur:" et de prendre la valeur du nom d'utilisateur à côté de lui avec l'ID de courrier électronique correspondant après le texte "courrier électronique principal:" et de le stocker dans datatable avec la sortie attendue comme ci-dessous
Résultat attendu dans Datatable comme ci-dessous
username primary email
3167763 [email protected]
3195330 [email protected]
ci-dessous est l'exemple de code que j'ai où je peux obtenir tout le nom d'utilisateur de la liste j'ai besoin de modifier le code ci-dessous pour obtenir à la fois le nom d'utilisateur et l'identifiant de messagerie principal correspondant ainsi dans une collection votre aide sera très utile
List<int> list = Regex.Matches(error_message, @"(?<=Error importing username: )\d+")
.Cast<Match>()
.Select(match => int.Parse(match.Value))
.ToList();
Réponses
Vous pouvez créer un dictionnaire avec le nom d'utilisateur comme clé et l'email comme valeur:
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]);
Le modèle comprend 2 groupes de capture, indiqués par des parenthèses, qui peuvent être utilisés pour extraire le nom d'utilisateur et l'e-mail de chaque correspondance.
Le modèle d'e-mail [^,]+
correspond simplement à un ou plusieurs caractères qui ne sont pas une virgule; il ne garantit pas des adresses e-mail valides.
Si c'est une exigence, plus de détails peuvent être trouvés ici .
Exemple de travail
Au lieu d'utiliser un seul regard en arrière, vous pouvez utiliser 2 groupes de capture.
\bError importing username: (\d+), primary email: ([^\s@]+@[^\s@,]+)
Démo Regex | Démo C #
Par exemple
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
);
}
Production
username: 3167763, primary email: [email protected]
username: 3195330, primary email: [email protected]