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 caaacabi wyszukam a.*?bje, 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”
abcabkanda.+?k, RegEx dopasuje cały ciąg.