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é.
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