2 Stimmen

Unterschiede zwischen (.*) und (.*?)

Mögliches Duplikat:
Was bedeutet "faul" und "gierig" in regexp?

Ich weiß, dass in Regex das Fragezeichen nach *, + oder ? ungerade bedeutet, aber wenn ich ein beliebiges Zeichen zuordnen möchte, was ist der Unterschied zwischen der Verwendung von (.*) oder (.*?)?

Gracias.

EDIT: In meinem Fall möchte ich eine URL überprüfen. Was sind die Unterschiede zwischen

http://site\.net/(.*?)\.html

y

http://site\.net/(.*)\.html

?

21voto

FThompson Punkte 27878

.* ist gierig, was bedeutet, dass es das nächste Begrenzungszeichen Ihrer Regex ignoriert, bis es selbst nicht erfüllt ist, es sei denn, die Regex nach .* gegen das Ende der Zielzeichenkette steht.

.*? ist ungereedet, d.h. es wird mit dem nächsten Begrenzungszeichen der Regex fortgefahren, wenn die nächste erfüllt ist. Es wird mit dem nächsten Begrenzungszeichen fortgesetzt, auch wenn es selbst noch anwendbar ist.

Beispiel:

/(.*) dog/ entspricht "Ich glaube, dein Hund hat meinen Hund gebissen" und Gruppe 1 ist "Ich glaube, dein Hund hat meinen gebissen".

/(.*?) dog/ entspricht "Ich glaube, Ihr Hund hat meinen Hund gebissen" und Gruppe 1 ist "Ich glaube, Ihr".

6voto

Gareth Punkte 123487

Wenn nichts nach der (.*) im regulären Ausdruck, dann gibt es absolut keinen Unterschied. Wenn es jedoch ist alles Folgende, dann gibt es einen Unterschied:

"I went to the shops and then I went home"

/(.*) went/  => "[I went to the shops and then I] went"
/(.*?) went/ => "[I] went"

3voto

jgauffin Punkte 97446

Nehmen wir an, Sie haben diese Url:

http://example.net/some/wierd/path.html?returnTo=somedoc.html

Die Gier würde auf die gesamte Linie zutreffen:

http://example.net/some/wierd/path.html?returnTo=somedoc.html

während nicht gierig zurückkehrt:

http://example.net/some/wierd/path.html

http://refiddle.com/ ist ideal, um reguläre Ausdrücke auszuprobieren

2voto

F.P Punkte 16562

Da Sie bereits wissen, was unredliches Verhalten ist, werde ich das nicht noch einmal erklären.

Es hängt davon ab, was kommt après les (.*?) - Das ist der Grund für ein unfreundliches Verhalten.

Interessanterweise bedeutet dies, dass eine Regex in der Form /(.*?)/ macht nicht viel Sinn - denn wie kann man faul sein, wenn man sowieso alles abgleicht?

Wenn Sie versuchen, diese Regex z.B. in Regexr wird es nicht einmal kompiliert, weil es Unsinn ist.

Nur wenn Sie etwas hinter die Gruppe setzen, ergibt Ihre Regex irgendeinen Sinn. Ich bin mir nicht sicher, ob alle Rege-Engines hier das Gleiche tun wie Regexr und diese Regex nicht akzeptieren.

Wenn Sie also etwas bis zu einem bestimmten Zeichen abgleichen wollen, müssen Sie dieses bestimmte Zeichen eingeben après Ihre "Untreue-irgendwas"-Gruppe. Auf diese Weise wird alles, was vor diesem bestimmten Zeichen liegt, abgeglichen.

Um es abschließend zu sagen: Es macht keinen Unterschied, IF es gibt nicht etwas NACH der Gruppe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X