1
votes

L'expression régulière sélectionne tous les chiffres après le préfixe avec le nombre minimum et maximum de chiffres et saute les caractères non numériques (max 4)

J'essaye de créer une expression régulière qui sélectionne un nombre après un mot clé. Exemple de données:

  • Contrat yyyuiy \ 12345678
  • Contrat hjdhd: 87654321 Payé
  • contrat somedata87654321T
  • Contrat de données d'erreur: 1234567899Erreur -> il contient trop de chiffres

Le mot-clé courant est "Contrat", après ce mot-clé, 0 à 4 caractères non numériques possibles. Puis le numéro du contrat qui est toujours entre 7 ou 8 chiffres. Lorsqu'il y a plus de chiffres, il ne doit pas être sélectionné. J'ai commencé avec (? <= Contrat) (. *) ([0-9] +) qui sélectionne trop. Je n'ai besoin que du numéro et uniquement s'il comporte 7 ou 8 chiffres.

Si vous avez une solution, pouvez-vous également expliquer comment, afin que je puisse en tirer des leçons.

le résultat devrait être

  • 12345678
  • 87654321
  • 87654321

4 commentaires

quelle langue utilisez-vous?


(? <= contrat) \ D * (\ d {7,8}) (? = \ D)


La langue est dot net. Je vais essayer de les utiliser


Ensuite, utilisez simplement (? i) (? <= contrat \ D *) \ d {7,8} (? = \ D) < / a>


4 Réponses :


1
votes

Vous pouvez utiliser un quantificateur pour spécifier le nombre de chiffres et de non chiffres et utilisez un lookahead négatif pour vérifier qu'après 7 ou 8 chiffres, il n'y a plus de chiffres après .

Pour faire correspondre toutes les variantes de contrat, vous pouvez rendre la correspondance insensible à la casse ou faire correspondre le contrat comme [Cc.,.,

(?<=\b[Cc]ontract\D{0,4})[0-9]{7,8}(?!\d)

Démo Regex

Cela correspondra

  • (? Un regard positif en arrière pour affirmer que ce qui est à gauche est un contrat ou un contrat (si vous ne voulez pas utiliser un look-back, vous pouvez également faire correspondre à la place \ b [Cc] ontract )
  • \ D {0,4} Correspond à 0 à 4 fois pas un chiffre
  • ([0-9] {7,8}) Capturer dans un groupe un chiffre 7 à 8 fois
  • (?! \ d) Une anticipation négative pour affirmer que ce qui suit n'est pas un chiffre

.NET prend en charge la recherche en arrière infinie. Dans ce cas, vous pouvez obtenir la correspondance en utilisant:

(?<=\b[Cc]ontract)\D{0,4}([0-9]{7,8})(?!\d)

. NET regex demo


2 commentaires

Merci, c'est la meilleure solution. Ça marche parfaitement


@ user3507211 Vous êtes les bienvenus. N'hésitez pas à marquer la réponse comme acceptée en en cliquant sur ✓ à gauche de cette réponse et envisagez de voter pour toutes les réponses qui vous ont été utiles .



1
votes

Vous pouvez utiliser cette expression régulière,

(?i)contract[^\d]{0,4}(\d{7,8})(?!\d)

Explication:

  • (? i) - Active la correspondance insensible à la casse comme quelque part vous avez un Contrat et d'autres contrat
  • contrat - correspond littéralement à ce texte
  • [^ \ d] {0,4} - Correspond à n'importe quel caractère de 0 à 4 fois sauf un chiffre
  • (\ d {7,8}) - Correspond à un chiffre de longueur 7 à 8
  • (?! \ d) - Rejette la correspondance s'il y a un chiffre devant

Démo


1 commentaires

Merci pour les réponses. et plus pour les explications. Cela a aidé



0
votes

Utilisation de javascript: / contract (?! (\ d {0-4})) (\ d {7,8}) (?! (\ d)) / i

"contrat" ​​suivi de 0 à 4 caractères qui ne sont pas numériques ( (?! (\ d {0-4})) signifie une chaîne d'une longueur comprise entre 0 et 4 qui ne contient pas chiffres) jusqu'à ce qu'une séquence de 7 ou 8 chiffres soit trouvée ( (\ d {7,8}) ) où le symbole suivant n'est pas un chiffre ( (?! (\ d)) ). L'indicateur i signifie que l'expression régulière est insensible à la casse.

Après avoir répondu, j'ai vu que la question était liée au .net. En c #, vous pouvez utiliser le même modèle (sauf le i à la fin) et passer l'option RegexOptions.IgnoreCase .


0 commentaires

0
votes

Essayez celui-ci

\b[cC]ontract\D{0,4}(\d{7,8})(?:\D|$)

Démo p>


0 commentaires