Expression régulière pour rechercher le premier match seulement
-
21-12-2019 - |
Question
J'ai ce texte :-
SOME text, .....
Number of successes: 3556
Number of failures: 22
Some text, .....
Number of successes: 2623
Number of failure: 0
Mon exigence est de trouver la première occurrence de ce modèle "Nombre de succès:(\d+)", qui est le Nombre de succès:3556.Mais l'expression ci-dessus renvoie les correspondances ultérieures ainsi.
Je veux l'expression régulière pour ce faire, pour moi, contrairement à java où je peux utiliser la boucle pour parcourir.
Quelqu'un peut m'aider avec une expression régulière qui peut trouver la première occurrence uniquement.
La solution
Une solution qui devrait fonctionner dans n'importe quelle langue:
(?s)\A(?:(?!Number of successes:).)*Number of successes: (\d+)
(?s) # Turn on singleline mode
\A # Start of string
(?: # Non-capturing group:
(?!Number of successes:) # Unless this text intervenes:
. # Match any character.
)* # Repeat as needed.
Number of successes:[ ] # Then match this text
(\d+) # and capture the following number
Voir It en direct sur REGEX101.COM .
Autres conseils
Juste au cas où les exigences de le faire via REGEXP n'est pas vraiment une exigence, voici des alternatives à l'approche (Nice) de Tim (qui utilise uniquement la REGEXP)
awk ' $0~/Number of successes: [1-9][0-9]*/ { print $0 ; exit 0 ;}'
ou le vraiment simple
grep 'Number of successes: [1-9][0-9]*' | head -1
Je préfère beaucoup l'awk one, car il cesse dès que il voit le premier match, alors que le 2e on pourrait traiter de nombreuses lignes après elle (jusqu'à ce qu'elle reçoive le Sigpipe ou la fin du fichier)
Essayez d'utiliser grep
avec -m
option
grep -m 1 'Number of successes: [0-9]\+' file