2 votes

Regex pour obtenir le mot après des mots de correspondance spécifiques

J'essaie d'extraire le montant en dollars de certaines factures. J'ai besoin que la correspondance soit sur le mot directement après le mot "TOTAL". De même, le mot "total" peut parfois apparaître suivi d'un deux-points (par ex. Total: ). Un exemple de texte est présenté ci-dessous :

4 Achat de crédit Discover - c REF# : 02353R TOTAL : 40.00 AID : 1523Q1Q TC : mzQm 40.00 CHANGE 0.00 NOMBRE TOTAL D'ARTICLES VENDUS = 0 23/12/17 Ql:38piii 414 9 76 1G6 MERCI DE VOTRE MAGASINAGE KR08ER recrute - postulez dès aujourd'hui !

Dans le cas de l'échantillon ci-dessus, la correspondance devrait être la suivante "40.00" .

La déclaration Regex que j'ai écrite :

(?<=total)([^\n\r]*)

retire TOUT ce qui suit le mot "total". Je ne veux que le mot suivant.

1voto

The fourth bird Points 40138

Ce que vous pourriez faire est de faire correspondre le total suivi d'un deux-points facultatif. :? et zéro ou plusieurs fois un caractère d'espacement. \s* et capturer dans un groupe un ou plusieurs chiffres suivis d'une partie facultative qui correspond à un point et à un ou plusieurs chiffres.

Pour faire correspondre une variante de total en majuscules ou en minuscules, vous pouvez rendre la correspondance insensible à la casse en ajoutant, par exemple, un élément modificateur (?i) ou utiliser un drapeau insensible à la casse.

\btotal:?\s*(\d+(?:\.\d+)?)

La valeur 40.00 sera dans le groupe 1.

1voto

JohnyL Points 3688

Les explications sont dans le modèle regex.

string str = "4 Discover Credit Purchase - c REF#: 02353R TOTAL: 40.00 AID: 1523Q1Q";
string pattern = @"(?ix)       # 'i' means case-insensitive search
                    \b         # Word boundary
                    total      # 'TOTAL' or 'total' or any other combination of cases
                    :?         # Matches colon if it exists
                    \s+        # One or more spaces
                    (\d+\.\d+) # Sought number saved into group
                    \s         # One space";
// The number is in the first group: Groups[1]
Console.WriteLine(Regex.Match(str, pattern).Groups[1].Value);

1voto

Bohemian Points 134107

Ceci (contrairement aux autres réponses jusqu'à présent) correspond sólo le montant total (c'est-à-dire sans avoir besoin d'examiner les groupes) :

((?<=\bTOTAL\b )|(?<=\bTOTAL\b: ))[\d.]+

Voir Démonstration en direct pour savoir si l'entrée a, ou n'a pas, le deux-points après TOTAL .

La raison pour laquelle 2 look behinds (qui ne capturent pas l'entrée) sont nécessaires est qu'ils ne peuvent pas avoir une longueur variable. Les deux-points facultatifs sont gérés en utilisant une alternance (une regex OU par l'intermédiaire de ...|... ) de 2 look behinds, un avec et un sans le colon.

Si TOTAL peut être dans tous les cas, ajouter (?i) (le ignorer le cas ) au début de l'expression rationnelle.

0voto

Sandeep Chauhan Points 71

Vous pouvez utiliser la regex ci-dessous pour obtenir le montant après TOTAL :

\bTOTAL\b:?\s*([\d.]+)

Il capturera le montant dans le premier groupe.

Lien : https://regex101.com/r/tzze8J/1/

0voto

Michał Turczyn Points 16193

Essayez ce modèle : TOTAL:? ?(\d+.\d+)[^\d]? .

Démo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X