2010-03-23 13 views
330

Meine RegexMuster so etwas wieRegulärer Ausdruck auf dem ersten Spiel zu stoppen

<xxxx location="file path/level1/level2" xxxx some="xxx"> 

sehen bin ich daran interessiert ist nur in dem Teil in Anführungszeichen Standort zugewiesen. Sollte es nicht so einfach wie unten ohne den gierigen Schalter sein?

/.*location="(.*)".*/ 

Scheint nicht zu funktionieren.

+0

Was ist Ihre Quelle, ist es HTML oder XML oder etwas? –

+14

Warum ist das ein Community-Wiki? Es ist eine echte Frage. Jetzt ist es zu spät. –

+0

@Kurresmack Es ist XML. – publicRavi

Antwort

686

Sie müssen Ihren regulären Ausdruck nicht gierig machen, da "(.*)" standardmäßig alle "file path/level1/level2" xxx some="xxx" entspricht.

Stattdessen können Sie Ihre Punkt-Sterne-nicht-gierig machen, was wird es so wenig Zeichen wie möglich entsprechen:

/location="(.*?)"/ 

eine ? auf einem quantifier Hinzufügen (?, * oder +) macht es nicht -gierig.

+25

FWIW, wenn du VIM verwendest, muss diese Regex etwas anders sein: statt '. *?' Ist es '. \ {-}' für ein nicht gieriges Match. – SooDesuNe

+24

Danke Daniel. ** "Hinzufügen eines? Auf einem Quantifizierer (?, * Oder +) macht es nicht gierig." ** ist hilfreicher Tipp für mich. – PhatHV

+5

Die? beschreibt meine Verwirrung beim Versuch, das herauszufinden. Wie angemessen. –

11

Verwenden Sie nicht gieriges Matching, wenn Ihr Modul dies unterstützt. Ergänzen Sie die ? in der Aufnahme.

/location="(.*?)"/ 
36

location="(.*)" passt auf von der „nach location=, bis die“ nach some="xxx, wenn Sie es nicht gierig machen. Sie müssen also entweder .*? (d. H. Machen Sie es nicht gierig) oder ersetzen Sie .* durch [^"]*.

+5

+1, '[^"] * "' ist klarer als '. *?" 'An jedem Tag – Kip

+3

[^"] * ist wahrscheinlich auch schneller bei den meisten Regex-Engines, da es das Muster nach dem aktuellen Muster nicht suchen muss . –

+1

@Kip: Sie haben wahrscheinlich Recht, aber die '. *?' Notation ist allgemeiner als '[^"] * ' – Bondax

20

Wie wäre es

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

Dies vermeidet die unbegrenzte Suche mit. * Und wird genau mit dem ersten Zitat übereinstimmen.

Verwandte Themen