Mein Regex-Muster sieht ungefähr so aus
<xxxx location="file path/level1/level2" xxxx some="xxx">
Ich interessiere mich nur für den Teil, der dem Standort zugeordnet ist. Sollte es nicht so einfach sein wie unten ohne den gierigen Schalter?
/.*location="(.*)".*/
Scheint nicht zu funktionieren.
Sie müssen Ihren regulären Ausdruck nicht gierig machen, da "(.*)"
standardmäßig mit dem gesamten "file path/level1/level2" xxx some="xxx"
übereinstimmt.
Stattdessen können Sie Ihren Punkt-Stern nicht gierig machen, sodass er so wenig Zeichen wie möglich enthält:
/location="(.*?)"/
Wenn Sie einen ?
an einem Quantifizierer (?
, *
oder +
) hinzufügen, wird dies nicht gierig.
location="(.*)"
stimmt von "after location=
" bis "after some="xxx
" überein, sofern Sie ihn nicht gierig machen. Sie müssen also entweder .*?
(d. H. Nicht gierig machen) oder besser .*
durch [^"]*
ersetzen.
Wie wäre es mit
.*location="([^"]*)".*
Dies vermeidet die unbegrenzte Suche mit. * Und stimmt genau mit dem ersten Angebot überein.
Verwenden Sie einen nicht gierigen Abgleich, wenn Ihre Engine dies unterstützt. Ergänzen Sie die ? in der Gefangennahme.
/location="(.*?)"/
Da Sie quantifiziertes Untermuster verwenden und wie in Perl Doc beschrieben,
Standardmäßig ist ein quantifiziertes Submuster " gierig ", dh es wird so oft wie übereinstimmen wie möglich (bei einem bestimmten Startort), während der Rest des Musters übereinstimmt. Wenn Sie möchten, dass es so oft wie möglich übereinstimmt , folgen Sie dem Quantifizierer mit ein "?" . Beachten Sie, dass sich die Bedeutungen nicht ändern, nur die "Gier":
*? //Match 0 or more times, not greedily (minimum matches)
+? //Match 1 or more times, not greedily
Damit Ihr quantifiziert Muster eine minimale Übereinstimmung erzielen kann, folgen Sie ihm mit ?
:
/location="(.*?)"/