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.
Réponses:
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
w
etW
puisque vos exemples contenaient les deux.Démo
la source
En supposant que "n'importe quoi" n'inclut pas de chiffres, vous pouvez utiliser cette expression régulière:
Démo sur regex101
la source
Un "cas d'angle manqué" possible de la réponse de CinCout est de savoir si la correspondance pour
someWord
doit être exacte, par exemple sinotsomeWord
etsomeWordNotThis
ne 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 poursomeWord
rechercher 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
la source
Vous pouvez essayer quelque chose comme ceci:
Vous pouvez voir le test ici
la source
d'abord séparé le
some[wW]ord
,number
etspace
avec un motif, puis exécutez le deuxième motif dessusLorsque le premier motif est exécuté, la phrase sera comme vous le souhaitez
changement:
la source
Mais parfois, quelque chose viendra entre Number et word.Veuillez voir l'exemple de ligne ci-dessous.
Ex:
essaye ça
Expliqué
Démo
la source
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.IgnoreCase
ou un modificateur en ligne(?i)
Voir une démonstration de regex .NET
la source
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.Lorsque ce qui précède est exécuté ( avec les
IgnorePatternWhiteSpace
supprime 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:
Visuellement, voici ce qui correspond:
la source