2013-06-20 13 views
7

Przeszukałem sieć w ciągu ostatnich kilku godzin, próbując dowiedzieć się, dlaczego w świecie jeden z moich kolegów nalega na używanie (?!.) jako ostatniej litery w swoich wyrażeniach regularnych zamiast zwykłego $.Wyrażenia regularne kończą się

Niektóre z wyrażeń regularnych widziałem były ^.*.txt(?!.) które zaczynają się od zwykłej ^, ale nie kończy się na $. Nie udało mi się znaleźć żadnych ostatecznych lub czasochłonnych powodów, żadnych plusów i minusów ani różnic w ogóle?

+0

Powinieneś dać [TDWTF] (http://thedailywtf.com/) przeczytać – Bojangles

+0

To rozejrzeć się, zobacz http://www.perlmonks.org/?node_id=518444 (to nie znaczy więcej znaków), ale nie musisz go używać, gdy chcesz po prostu użyć '$', to przesada –

+0

czy go nawet zapytałeś? –

Odpowiedz

4

$może dopasowania końca linii zamiast zakończeniu wprowadzania (to zależy od użyte modyfikatory). Być może to jest powód.

Moim zdaniem najlepszym sposobem, aby dopasować koniec wejścia jest \z - co oznacza dokładnie koniec wejścia, niezależnie od modyfikatorów. Jest obsługiwany w większości (jeśli nie we wszystkich) implementacjach regex.

+0

Ahhh, interesujące. Mogłem zobaczyć, że jest to problem w naszym systemie, ponieważ mamy do czynienia z wieloma platformami i wieloma językami, więc przypuszczam, że oczekiwanie funkcjonalne jest niskie - lepiej zachowaj ostrożność przy składni. Dzięki, nie wiedziałem o '\ z'. –

2

^.*\.txt(?!.) oznacza dopasowanie (początek) (dowolne 0 lub więcej razy) .txt i nie następuje po nim nic.

Możesz uzyskać więcej informacji na temat wzoru ?!here.

Jeśli spojrzysz na here, oznacza to, że używając modyfikatorów m lub s, możesz zmodyfikować zachowanie^i $, aby dopasować początek lub koniec linii, zamiast całego ciągu znaków. Jest też ms. Myślę więc, że z (?!.) możesz dopasować koniec całego wieloliniowego łańcucha.

Nie powiedziałbym, że używanie tego jest lepsze. Powiedziałbym raczej, że powinieneś dokładnie wiedzieć, czego szukasz lub co zamierzasz zrobić, w ciągu jedno-liniowym lub wielo-liniowym ciągu znaków i jak chcesz przeanalizować dane wejściowe, aby uzyskać jedną linię lub wieloliniowe ciągi, przed przejściem do wyrażenia regularnego.

Myślę, że wielu z nas uruchamia regexps na jednowierszowych ciągach znaków i dlatego nie odczuwamy różnicy między tymi dwiema składniami.

+0

Dzięki! Doceniam poszukiwania, ale wygląda na to, że obaj szukamy tego samego - nie ma powodu, a mój kolega to po prostu szalona osoba. Czy wiesz, czy występują różnice w wydajności? –

+0

zaktualizowałem moją odpowiedź z odrobiną więcej informacji. Nie wiem, czy automatycznie uruchamia cię. – ruben2020

Powiązane problemy