it-swarm.com.de

Regulärer Ausdruck, der beim ersten Spiel angehalten werden soll

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.

414
publicRavi

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.

860

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.

46
sepp2k

Wie wäre es mit

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

Dies vermeidet die unbegrenzte Suche mit. * Und stimmt genau mit dem ersten Angebot überein.

26
user193690

Verwenden Sie einen nicht gierigen Abgleich, wenn Ihre Engine dies unterstützt. Ergänzen Sie die ? in der Gefangennahme.

/location="(.*?)"/
16
codenheim

Die Verwendung von Lazy-Quantifizierern ? ohne globales Flag ist die Antwort. 

Z.B, 

 enter image description here

Wenn Sie ein globales Flag /g hätten, hätten Sie alle Übereinstimmungen mit der niedrigsten Länge wie unten angegeben.  enter image description here

7
Uddhav Gautam

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="(.*?)"/
1
Mohammad Kanan