Mój wzór wyrażenia regularnego wygląda mniej więcej tak
<xxxx location="file path/level1/level2" xxxx some="xxx">
Interesuje mnie tylko ta część cytatów przypisanych do lokalizacji. Czy nie powinno być tak łatwe jak poniżej bez chciwego przełącznika?
/.*location="(.*)".*/
Nie wydaje się działać.
Odpowiedzi:
Musisz sprawić, by wyrażenie regularne nie było zachłanne, ponieważ domyślnie
"(.*)"
będzie pasowało do wszystkich"file path/level1/level2" xxx some="xxx"
.Zamiast tego możesz sprawić, by twoja gwiazda kropka nie była chciwa, co sprawi, że będzie pasować jak najmniej znaków:
Dodanie
?
na kwantyfikatorem (?
,*
lub+
) sprawia, że nie chciwi.źródło
.*?
to.\{-}
dla nie-chciwy meczu.location="(.*)"
dopasuje od „polocation=
do” po,some="xxx
chyba że sprawisz, że nie będzie chciwy. Więc albo musisz.*?
(tj. Sprawić, że będzie niechciany), albo lepiej zastąp.*
go[^"]*
.źródło
.*?
notacja jest bardziej ogólna niż[^"]*
Co powiesz na
Pozwala to uniknąć nieograniczonego wyszukiwania za pomocą. * I pasuje dokładnie do pierwszego cytatu.
źródło
Użyj niepochodnego dopasowania, jeśli Twój silnik to obsługuje. Dodaj ? wewnątrz schwytania.
źródło
Odpowiedzią jest użycie leniwych kwantyfikatorów
?
bez flagi globalnej.Na przykład,
Gdybyś miał
/g
wtedy flagę globalną , pasowałby do wszystkich dopasowań o najniższej długości, jak poniżej.źródło
Ponieważ używasz ilościowego subpattern i jak opisano w Perl Doc ,
Dlatego, aby pozwolić twojemu wzorcu ilościowemu na dopasowanie minimalne, wykonaj następujące czynności
?
:źródło
Oto inny sposób.
Oto ten, którego chcesz. To jest leniwe
[\s\S]*?
Pierwszy element:
[\s\S]*?(?:location="[^"]*")[\s\S]*
Zamień na:$1
Wyjaśnienie : https://regex101.com/r/ZcqcUm/2
Dla kompletności otrzymuje się ostatni. To jest chciwe
[\s\S]*
Ostatni element:
[\s\S]*(?:location="([^"]*)")[\s\S]*
Zamień na:$1
Wyjaśnienie : https://regex101.com/r/LXSPDp/3
Jest tylko jedna różnica między tymi dwoma wyrażeniami regularnymi i to jest
?
źródło