Jak powiedzieć wyrażeniu RegEx (wersja .NET), aby uzyskać najmniejsze prawidłowe dopasowanie zamiast największego?
Jak powiedzieć wyrażeniu RegEx (wersja .NET), aby uzyskać najmniejsze prawidłowe dopasowanie zamiast największego?
Odpowiedzi:
W przypadku wyrażenia regularnego, takiego jak .*
lub .+
, dołącz znak zapytania ( .*?
lub .+?
), aby dopasować jak najmniej znaków. Aby opcjonalnie dopasować sekcję, (?:blah)?
ale bez dopasowywania, chyba że jest to absolutnie konieczne, użyj czegoś takiego jak (?:blah){0,1}?
. W przypadku powtarzającego się dopasowania (przy użyciu {n,}
lub {n,m}
składni) dołącz znak zapytania, aby dopasować jak najmniejszą liczbę (np. {3,}?
Lub {5,7}?
).
Pomocna może być również dokumentacja dotycząca kwantyfikatorów wyrażeń regularnych .
Operator nie chciwy ?
. Tak jak to:
.*?
Operator niechciwy nie oznacza najkrótszego możliwego dopasowania:
abcabk
a.+?k
dopasuje cały ciąg (w tym przykładzie) zamiast tylko trzech ostatnich znaków.
Zamiast tego chciałbym znaleźć najmniejsze możliwe dopasowanie.
To jest ostatnie możliwe dopasowanie dla „ a
”, aby nadal zezwalać na wszystkie dopasowania k
.
Myślę, że jedynym sposobem na to jest użycie wyrażenia takiego jak:
a[^a]+?k
cab
. Jeśli moje dane wejściowe to caaacab
i wyszukam a.*?b
je, zwróci pełny ciąg zamiast krótkiego dopasowania wewnątrz. Jak szukać wstecz od b
?
START[^START]*?END
(gdzie START i END to początkowe i końcowe wyrażenia regularne znaków). Zasadniczo oznacza to „dopasuj wszystko od START do END, gdzie postacie pośrednie nie obejmują START ponownie”
abcabk
anda.+?k
, RegEx dopasuje cały ciąg.