100 votes

Regex pour obtenir les mots après la chaîne de correspondance

Voici le contenu :

Sujet :
    ID de sécurité :        S-1-5-21-3368353891-1012177287-890106238-22451
    Nom du compte :       ChamaraKer
    Domaine du compte :     JIC
    ID de connexion :       0x1fffb

Objet :
    Serveur de l'objet :  Sécurité
    Type d'objet :    Fichier
    Nom de l'objet :    D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
    ID de gestion :  0x11dc

Je dois capturer les mots après le mot Nom de l'objet: dans cette ligne. Qui est D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log.

Comment puis-je faire cela ?

^.*\bNom de l'objet\b.*$ correspond à - Nom de l'objet

75voto

hwnd Points 35496

Mais j'ai besoin que le résultat du match soit ... pas dans un groupe de match...

Pour ce que vous essayez de faire, cela devrait fonctionner. \K réinitialise le point de départ du match.

\bNom de l'objet:\s+\K\S+

Vous pouvez faire de même pour obtenir vos correspondances de ID de sécurité.

\bID de sécurité:\s+\K\S+

60voto

smerny Points 7555

Si vous utilisez un moteur regex qui ne prend pas en charge \K, ce qui suit devrait fonctionner pour vous:

[\n\r].*Nom de l'objet:\s*([^\n\r]*)

Exemple de travail

Votre correspondance souhaitée se trouvera dans le groupe de capture 1.


[\n\r][ \t]*Nom de l'objet:[ \t]*([^\n\r]*)

Serait similaire mais ne permettrait pas des choses telles que " blah Nom de l'objet: blah" et s'assurerait également de ne pas capturer la ligne suivante s'il n'y a pas de contenu réel après "Nom de l'objet:"

20voto

Ravi Thapliyal Points 19305

Vous y êtes presque. Utilisez le regex suivant (avec l'option multi-ligne activée)

\bNom de l'objet: \s+(.*)$

La correspondance complète serait

Nom de l'objet:   D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log

tandis que le premier groupe capturé contiendrait

D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log

Si vous voulez capturer directement le chemin du fichier, utilisez

(?m)(?<=\bNom de l'objet:).*$

18voto

Himanshu Chauhan Points 636

Cela pourrait fonctionner pour vous en fonction de la langue que vous utilisez:

(?<=Nom de l'objet:).*

C'est une assertion de lookbehind positive. Plus d'informations peuvent être trouvées ici.

Cela ne fonctionnera pas avec JavaScript cependant. Dans votre commentaire j'ai lu que vous l'utilisez pour logstash. Si vous utilisez l'analyse GROK pour logstash alors cela fonctionnerait. Vous pouvez le vérifier vous-même ici:

https://grokdebug.herokuapp.com/

Entrer la description de l'image ici

-4voto

Ryan Norris Points 70

Voici un script Perl rapide pour obtenir ce dont vous avez besoin. Il a besoin de certains espacement.

#!/bin/perl

$sample = <

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