2010-03-23 10 views
330

Moje regex wzór wyglądałWyrażenie regularne, aby zatrzymać w pierwszym meczu

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

Jestem zainteresowany tylko w części w cudzysłowie przypisanych do lokalizacji. Czy nie powinno być tak łatwo jak poniżej bez chciwego przełącznika?

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

Nie wydaje się działać.

+0

Jakie jest twoje źródło, czy to HTML czy xml czy coś takiego? –

+14

Dlaczego to jest wiki społeczności? To prawdziwe pytanie. Teraz już za późno. –

+0

@Kurresmack To jest XML. – publicRavi

Odpowiedz

686

Musisz zrobić regularne wyrażenie nie chciwe, ponieważ domyślnie "(.*)" będzie pasować do wszystkich "file path/level1/level2" xxx some="xxx".

Zamiast tego można dokonać dot-gwiazda nie chciwi, które sprawiają, że pasuje jak kilka znaków jak to możliwe:

/location="(.*?)"/ 

dodanie ? na kwantyfikatorem (?, * lub +) sprawia, że ​​zakaz -chciwy.

+25

FWIW, użyj swojego VIM, ten regex musi być trochę inny: zamiast '. *?' To '. \ {-}' dla nie-chciwego pojedynku. – SooDesuNe

+24

Dzięki Daniel. ** "Dodanie znaku? Na kwantyfikatorze (?, * Lub +) powoduje, że nie jest on chciwy." ** jest dla mnie pomocną wskazówką. – PhatHV

+5

? opisuje moje zamieszanie próbując to zrozumieć. Jak odpowiednie. –

11

Użyj dopasowania nienoszącego, jeśli twój silnik je obsługuje. Dodaj ? wewnątrz przechwytywania.

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

location="(.*)" dopasuje się od „po location= do momentu, aż” po some="xxx chyba zrobić to nie chciwy. Potrzebujesz albo .*? (to jest uczynić to nie chciwym) lub lepiej zastąpić .* przez [^"]*.

+5

+1, '[^"] * "' jest bardziej przejrzyste niż ". *?" 'Dowolny dzień – Kip

+3

[^"] * jest prawdopodobnie także szybsze w przypadku większości silników regex, ponieważ nie musi szukać wzorca po bieżącym wzorze . –

+1

@Kip: Prawdopodobnie masz rację, ale notacja '. *?' Jest bardziej ogólna niż '[^"] * ' – Bondax

20

Jak o

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

ten sposób unika się poszukiwania z nieograniczoną. * I będzie pasował dokładnie do pierwszego cytatu.

Powiązane problemy