RexEx: S'arrêter à la première occurrence

La chaîne de caractère ressemble à quelque chose comme:

<xxxx path="chemin/vers/fichier" xxxx attr="xxx">

Je ne m’intéresse qu’à la partie entre guillemets attribuée à path.

/.*path="(.*)".*/

L’expression régulière ci-dessus n’a pas marché.

Vous devez rendre votre expression régulière paresseuse/non gourmande, car par défaut, (.*) correspondra à "chemin/vers/fichier" xxxx attr="xxx".

Au lieu de cela, vous pouvez faire en sorte que .* ne soit pas gourmande, ce qui la fera correspondre à un nombre de caractères aussi réduit que possible :

/path="(.*?)"/

Voir le demo.

L’ajout d’un ? sur un quantificateur ( ?, * ou +) le rend non gourmand.

Note: ceci n’est disponible que dans les moteurs de regex qui implémentent les extensions de Perl 5 (Java, Ruby, Python, etc.) mais pas dans les moteurs de regex « traditionnels » (y compris Awk, sed, grep sans -P, etc.).

Pourquoi pas

.*path="([^"]*)".*

Cela permet d’éviter une recherche illimitée avec .* et d’obtenir une correspondance exacte jusqu’à la première guillemette.

Voici une autre façon de faire. Le premier élément :

[\s\S]*?(?:path="[^"]*")[\s\S]* 

Remplacer par : $1