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 #

Nov 23 2020

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

JohnathanBarclay Nov 23 2020 at 10:06

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

Thefourthbird Nov 23 2020 at 10:10

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]