Comment obtenir les chiffres avant un mot particulier en utilisant l'expression régulière en c #?


10

Nous utiliserons ci-dessous l'expression régulière pour obtenir les chiffres avant les mots.

Exemple :

838123 certains mots 8 certains mots 12 certains mots

(\d+)\s*someWord

Mais parfois, quelque chose viendra entre Number et word.Veuillez voir l'exemple de ligne ci-dessous.

Ex:

43434 de someword 12 n'importe quoi someword 2323 nouveau someword

Comment obtenir le chiffre exact avant ce mot en utilisant l'expression régulière?

Veuillez me faire part de vos suggestions.


3
Il semble que les messages existants répondent à votre question. Veuillez informer les répondeurs et les futurs lecteurs si vous trouvez les réponses utiles ( Visite guidée ). Sinon, veuillez fournir plus de détails sur ce que vous recherchez et pourquoi les réponses ne conviennent pas à votre cas.
Reza Aghaei

1
Pas clair ce que vous demandez ...
JohnyL

Réponses:


14

Faites ceci:

(\d+)[^\d]+some[wW]ord

Vous devez accepter autre chose que des chiffres eux-mêmes. J'ai aussi considéré les deux wet Wpuisque vos exemples contenaient les deux.

Démo


Cherchez-vous une réponse différente?
Reza Aghaei

@RezaAghaei peut
CinCout

Quels sont les problèmes avec la réponse actuelle que vous avez fournie? Quelles améliorations recherchez-vous?
Reza Aghaei

@RezaAghaei Le fait que OP n'ait pas encore accepté de réponse me fait penser si j'ai raté un cas de coin ou quelque chose. Des approches alternatives pour le résoudre sont également les bienvenues.
CinCout

1
@ CinCout-ReinstateMonica Veuillez voir ma réponse pour un éventuel cas de bord manqué ( je ne sais pas si cela est pertinent pour l'OP).
Steve Chambers

4

En supposant que "n'importe quoi" n'inclut pas de chiffres, vous pouvez utiliser cette expression régulière:

(\d+)[^\d]+someWord

Démo sur regex101


3

Un "cas d'angle manqué" possible de la réponse de CinCout est de savoir si la correspondance pour someWorddoit être exacte, par exemple si notsomeWordet someWordNotThisne doit pas être appariée.

L'extension suivante de cette expression régulière permet de résoudre ce problème:

(\d+)[^\d]*[^\w]some[wW]ord[^\w]

Explication: L' [^\w]avant ou après le matcher pour someWordrechercher un "caractère non-mot" avant et après - une fin de ligne compte également ici. Cela pourrait bien sûr être rendu plus complexe / spécifique, en fonction des exigences exactes.

Démo


3

Vous pouvez essayer quelque chose comme ceci:

(\d+)\s?([^\d]*)

(\d+)    - get the digits
\s?      - discard a possible space
([^\d]*) - get all chars that are not digits

Vous pouvez voir le test ici


3

d'abord séparé le some[wW]ord, numberet spaceavec un motif, puis exécutez le deuxième motif dessus

 var pattern = @"\b(some[wW]ord|[\d]|\s)*\b";
 var rgx = new Regex(pattern);
 var sentence = "43434 of someword 12 anything someword 2323 new someword";
 var result = string.Empty;
 foreach (Match match in rgx.Matches(sentence)){
     result += match.Value;
}
//output => result: 43434 someword 12 someword 2323 someword

 var patternOnCorrectSentence = @"\b(\d+)\s*some[wW]ord*\b";
 var rgxOnCorrectSentence = new Regex(patternOnCorrectSentence);

 var resultOnCorrectSentence = new List<string>();
 foreach (Match match in rgxOnCorrectSentence.Matches(result)){
     resultOnCorrectSentence.Add(match.Value);
 }
 resultOnCorrectSentence.ForEach(Console.WriteLine);

 Console.ReadKey();

Lorsque le premier motif est exécuté, la phrase sera comme vous le souhaitez

43434 de someword 12 n'importe quoi someword 2323 nouveau someword

changement:

43434 un mot 12 un mot 2323 un mot


2

Mais parfois, quelque chose viendra entre Number et word.Veuillez voir l'exemple de ligne ci-dessous.

Ex:

43434 de someword 12 n'importe quoi someword 2323 nouveau someword

essaye ça

(\ d +) (. *?) un mot

Expliqué

\ d + - nombres

. *? - quoi que ce soit après les nombres, mais occurrence minimale.

someword - correspondance exacte de quelque peu

Démo


2

L'utilisation \s*ne correspondra qu'à 0 ou plusieurs caractères d'espacement.

Vous pouvez l'utiliser, \D+mais il correspondra également aux sauts de ligne car il correspond à n'importe quel caractère sauf un chiffre.

Si vous souhaitez faire correspondre les chiffres sur la même ligne, vous pouvez ajouter ne correspondant pas à une nouvelle ligne à une classe de caractères inversée [^\d\r\n]

Dans votre exemple, vous utilisez \d, mais si vous souhaitez uniquement faire correspondre 1 ou plusieurs chiffres de 0 à 9, vous pouvez utiliser une classe de caractères[0-9]+

Pour éviter que les chiffres et le mot ne fassent partie d'un mot plus grand, vous pouvez utiliser les limites des mots \b

Si vous souhaitez faire correspondre le mot d'une manière insensible à la casse, vous pouvez utiliser RegexOptions.IgnoreCaseou un modificateur en ligne(?i)

(?i)\b([0-9]+)\b[^\d\r\n]*\bsomeword\b

Voir une démonstration de regex .NET


2

Utilisez les captures de match nommées (pour obtenir l'utilisation des données mtch.Groups["Value"].Value... etc) pour extraire les informations selon vos besoins.

(?<Value>\d+)     -- Get the digits
(?<Other>.+?)     -- Capture all text, but minimal (greedy) capture
(?<Key>someword)  -- til the keyword here.

Lorsque ce qui précède est exécuté ( avec les IgnorePatternWhiteSpacesupprime les commentaires et rejoindre le modèle pour l' exécuter, comme (?<Value>\d+)(?<Other>.+?)(?<Key>someword)sans option regex ) , il obtient les données pour chaque donnée / paires de clés et organise chacun dans une seule partie .

Résultat

Voici le résultat (pour votre deuxième exemple) qui sont tous contenus dans des correspondances individuelles et leurs groupes et captures fournissent dans chaque correspondance:

Match #0
              [0]:  43434˽of˽someword
  ["Value"]  [1]:  43434
      1 Captures:  43434
  ["Other"]  [2]:  ˽of˽
      2 Captures:  ˽of˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #1
              [0]:  12˽anything˽someword
  ["Value"]  [1]:  12
      1 Captures:  12
  ["Other"]  [2]:  ˽anything˽
      2 Captures:  ˽anything˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #2
              [0]:  2323˽new˽someword
  ["Value"]  [1]:  2323
      1 Captures:  2323
  ["Other"]  [2]:  ˽new˽
      2 Captures:  ˽new˽
    ["Key"]  [3]:  someword
  3 Captures:  someword

Visuellement, voici ce qui correspond:

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.