Question

J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM
J0000010: Project name: E:\foo.pf
J0000011: Job name: MBiek Direct Mail Test
J0000020: Document 1 - Completed successfully

J'ai cette gigantesque chaîne laide et j'essaie d'en extraire des morceaux en utilisant regex.

Dans ce cas, je veux tout récupérer après "Nom du projet" jusqu'à la partie où il est écrit "J0000011 :" (le 11 sera un nombre différent à chaque fois).

Voici l'expression régulière avec laquelle j'ai joué

Project name:\s+(.*)\s+J[0-9]{7}:

Le problème est qu'il ne s'arrête que lorsqu'il atteint le J0000020 : à la fin.

Comment puis-je arrêter l'expression régulière à la première occurrence de J[0-9]{7}?

Était-ce utile?

La solution

Faire .* non gourmand en ajoutant '?' après ça:

Project name:\s+(.*?)\s+J[0-9]{7}:

Autres conseils

Utiliser des quantificateurs non gourmands ici est probablement la meilleure solution, également parce qu'elle est plus efficace que l'alternative gourmande :Les correspondances gourmandes vont généralement aussi loin qu'elles le peuvent (ici, jusqu'à la fin du texte !) puis remontent caractère après caractère pour essayer de faire correspondre la partie qui suit.

Cependant, envisagez plutôt d'utiliser une classe de caractères négative :

Project name:\s+(\S*)\s+J[0-9]{7}:

\S signifie « tout sauf un espace et c'est exactement ce que vous voulez.

Bien, ".*" est un sélecteur gourmand.Vous le rendez non gourmand en utilisant ".*?" Lors de l'utilisation de cette dernière construction, le moteur d'expression régulière fera correspondre, à chaque étape, le texte dans le "." essayez de faire correspondre n'importe quelle marque après le ".*?".Cela signifie que si par exemple rien ne vient après le ".*?", alors ça ne correspond à rien.

Voici ce que j'ai utilisé. s contient votre chaîne d'origine.Ce code est spécifique à .NET, mais la plupart des versions d'expression régulière auront quelque chose de similaire.

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;

Je vous recommanderais également d'expérimenter des expressions régulières en utilisant "Expresso" - c'est un utilitaire formidable (et gratuit) pour l'édition et les tests d'expressions régulières.

L'un de ses avantages est que son interface utilisateur expose de nombreuses fonctionnalités d'expression régulière avec lesquelles les personnes inexpérimentées ne sont peut-être pas familières, de manière à ce qu'il leur soit facile d'apprendre ces nouveaux concepts.

Par exemple, lorsque vous créez votre regex à l'aide de l'interface utilisateur et que vous choisissez "*", vous avez la possibilité de cocher la case "Le moins possible" et de voir l'expression régulière résultante, ainsi que de tester son comportement, même si vous n'êtes pas familier avec expressions non gourmandes avant.

Disponible en téléchargement sur leur site :http://www.ultrapico.com/Expresso.htm

Téléchargement express :http://www.ultrapico.com/ExpressoDownload.htm

(Nom du projet :\s+[A-Z]:(?:\\w+)+.[a-zA-Z]+\s+J[0-9]{7})(?=:)

Cela fonctionnera pour vous.

L'ajout de (?:\\w+)+.[a-zA-Z]+ sera plus restrictif au lieu de .*

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top