Dowód 1 , dowód 2 , myślę, że nie będzie ci trudno przypomnieć sobie inne przykłady.
Rzecz w tym, że jeśli istnieje więcej niż jeden sposób rozwiązania problemu, programista PHP (zazwyczaj przeglądam znacznik PHP na StackOverflow) poprosi o pomoc w rozwiązaniu obejmującym wyrażenia regularne.
Nawet jeśli będzie to mniej ekonomiczne, nawet jeśli podręcznik php sugeruje ( link ), aby użyć str_replace
zamiast dowolnego preg_*
lub ereg_*
działać, gdy nie są wymagane żadne fantazyjne zasady podstawiania.
Czy ktoś ma pojęcie, dlaczego tak się dzieje?
Nie zrozum mnie źle, niektórzy z moich najlepszych przyjaciół są wyrażeniami regularnymi i nie gardzę Perlem. Nie rozumiem, dlaczego nie ma żadnej alternatywy, nawet jeśli przesada jest oczywista (wyrażenie regularne do przełączania ciągów) lub złożoność kodu rośnie wykładniczo (wyrażenie regularne w celu uzyskania danych z HTML w PHP )
źródło
Odpowiedzi:
Ponieważ na poziomie podświadomości czują się jak cały inteligentny program, który może wiele osiągnąć z własnej woli, jednocześnie obejmując i samoregulując (wzorce myślenia).
To dlatego ludzie od razu wierzą, że wyrażenia regularne rozwiążą każde z zadań tekstowych, w jakiś sposób nie myśląc, że to może być przesada, i nie zdając sobie sprawy, że to może być zbyt słabe (parsowanie języków).
Malutka rzecz zawierająca magiczną moc. Nie możesz powiedzieć nie, prawda?
źródło
Gdy jedynym narzędziem, które masz, jest wyrażenie regularne, każdy problem wygląda
^((?>[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
źródło
Myślę, że to dlatego, że:
źródło
We wcześniejszych fazach mojej kariery (tj. Przed PHP) byłem guru Perla, a jednym z głównych aspektów gurudom Perla jest opanowanie wyrażeń regularnych.
W moim obecnym zespole jestem dosłownie jedynym, który sięga po wyrażenia regularne przed innymi (zwykle ohydniejszymi) narzędziami. Wydaje się, że reszta zespołu to czysta magia. Podejdą do mojego biurka i poproszą o wyrażenie regularne, którego skompletowanie zajmuje mi dosłownie dziesięć sekund, a następnie wysadzą w powietrze, gdy zadziała. Nie wiem - tak długo z nimi pracowałem, w tym momencie jest to po prostu naturalne.
W przypadku braku regex-fluencji, masz kombinacje instrukcji kontroli przepływu, które obejmują instrukcje strstr i strpos, co staje się brzydkie i trudne do uruchomienia w twojej głowie. Wolałbym stworzyć jedną elegancką regex niż trzydzieści linii szukania sznurka.
źródło
Przeciwnie. Ludzie papugują wyrażenia regularne są złym memem zbyt często IMO. Oczywiste jest, że preg_match jest nadużywany
php
, ale mniej oczywiste jest, że jest to rozsądne (w PHP).Posunąłbym się tak daleko i przypuszczam, że jest to kolejna mikrooptymalizacja w php land do użycia funkcji łańcuchowych. Jest ich wiele i są one zwykle lepszym wyborem. Ale nie powinieneś unikać
preg_match
wielokrotnościstrpos
iif
łańcuchów. Ponieważ w praktyce okazuje się, libpcre jest często szybszy niż PHP może wykonać pętlę szukającą alternatywnych ciągów znaków, npW ostatnim przykładzie uświadomiłem sobie, że sprawdzanie, czy łańcuch jest małymi literami:
Jest bardziej czytelny niż:
Zakładasz, że pierwszy musi być szybszy, ponieważ jest w całości oparty na PHP. Ale w rzeczywistości wyrażenie regularne spogląda na ciąg tylko raz i może przerwać zanegowany warunek, gdy tylko znajdzie wielką literę. Metoda strtolower () jednak dwukrotnie przegląda łańcuch. Pierwsza funkcja strtolower () tworzy duplikat łańcucha, iterując każdą literę, porównując ją i dodając do niej duże litery. Następnie
==
iteruje oryginał i kopię, porównując je jeszcze raz.To nie jest oczywisty przypadek. Aby być obiektywnym, pierwszy jest często szybszy, ponieważ zwykle porównujesz tylko krótkie ciągi. Konieczne jest jednak, aby nie ślepo zakładać, że funkcje łańcuchowe PHP są zawsze wskazane w stosunku do wyrażeń regularnych.
(Kusi mnie, aby dodać kolejne zdanie o zabawnej odpowiedzi @ bobince dotyczącej wyrażeń regularnych xhtml oraz o tym, jak często jest ostatnio łączone w bardzo nieprzydatny sposób. A bardziej obiektywne odpowiedzi poniżej są ignorowane).
źródło
/x
trybie, aby pozwolić na spacje w łokciach kognitywnego fragmentowania i na komentarze wyjaśniające, dlaczego się to dzieje, powinien oczywiście mieć zamknięte uszy. Ale w przypadku rzeczywistych wyrażeń regularnych o rozsądnej złożoności należy rozważyć zastosowanie odgórnego projektowania za pomocą wyrażeń gramatycznych . Gdy zobaczysz światło, nigdy nie wrócisz do/@#$^^@#$^&&*)@#/
.Wyrażenia regularne są bardzo atrakcyjne, ponieważ są najlepszym narzędziem do analizowania języka regularnego.
Mają następujące zalety:
N
w czasie O (N
).To sprawia, że są atrakcyjne w sytuacjach, w których są odpowiednie, ale ludzie mogą ich używać w kontekstach, w których nie są najlepszym narzędziem, ponieważ:
źródło
vi
, założycie się, że wykorzystam:%s/foo/bar/gc
na tym swoje życie . Jeśli jest wystarczająco dobry dla edytora, jest wystarczająco dobry dla skryptu.Hmmm, mogę tylko zgadywać. Być może niektórzy zauważyli, że 30 wierszy ich kodu zostało zastąpionych wyrażeniem regularnym o długości 20 znaków, więc nie jest w stanie używać niczego innego, gdy można użyć wyrażeń regularnych.
źródło
Pasuje do tego, jak myślą niektórzy ludzie. Nie lubię ich, ale mam przyjaciół, którzy wydają się myśleć w wyrażeniach regularnych. Wydaje mi się, że część mózgu odpowiadająca wzorowi jest bardziej odsłonięta niż logika formalna. :-)
źródło
Myślę, że wszechobecność wyrażeń regularnych wynika z wszechobecności ciągów. Ciąg jest najprostszą strukturą danych, pierwszą, której większość z nas się uczy. Ponieważ cały nasz kod jest napisany w formie symbolicznej, naturalne jest dla programisty rozważenie modelowania czegoś w formie symbolicznej. Ale jeśli nasz język programowania stwarza jakikolwiek opór, gdy próbujemy rozszerzyć jego składnię na nasze nowe sprytne formy symboliczne, wszystkie kończą się między cudzysłowami. Relacyjny model danych ma SQL. Model danych XML ma XQuery. Ale co z skromnym modelem danych łańcuchowych? Regex!
Wczoraj szukałem interfejsu API w poszukiwaniu błyszczącej nowej struktury JavaScript obsługującej tworzenie gier HTML5. Ma mechanizm deklaratywny opisujący główne podsystemy, których potrzebowałaby Twoja gra. Jak określa się te funkcje? JSON? Płynna notacja kropkowa? Tablica? Nie - ciąg zawierający listę nazw elementów oddzielonych przecinkami i spacjami. Zastanawiam się, jak analizuje tę listę ...?
źródło
Ponieważ wszystko możesz zobaczyć na raz. Dzięki temu, że widzisz całość, łatwiej jest pracować, a to zawsze jest miłe. Jest to rodzaj powodu, dla którego wielu programistów C ++ nadal używa instrukcji printf-type: Nie jest to bezpieczne dla typów (chociaż gcc przynajmniej może sprawdzać typy w instrukcjach printf) i nie jest ładne, ale chłopiec jest kompaktowy i użyteczny.
Jeśli jest to dość proste wyrażenie regularne, to często są one najlepszym sposobem na robienie rzeczy - ich kompaktowa forma i wiele możliwości czynią je idealnymi do określonych zadań. Problem pojawia się, gdy sprawiasz, że wyrażenie regularne jest tak skomplikowane, że nie możesz go już odczytać, lub gdy używasz złożonego wyrażenia regularnego, aby zrobić coś, co można szybciej zrobić za pomocą prostych operacji łańcuchowych.
Regex, jak każde inne potężne narzędzie, musi być używane z odpowiednim umiarem - nie za dużo, nie za mało. I o ile wydajność nie stanowi dużego problemu, pojedyncze wyrażenie regularne może czasami być szybsze do napisania i łatwiejsze do debugowania niż seria operacji na łańcuchach.
źródło
Hmm, obecne odpowiedzi zbytnio skupiają się na aspektach technicznych oraz na zaletach / wadach czytelności (co jest ważnym punktem). Pozwólcie, że spróbuję przenieść to trochę bardziej na środowisko / społeczność PHP:
Ale to tak, jak dodatkowe uwagi. Uważam, że i tak są to głównie względy percepcyjne i techniczne, które prowadzą do nadużywania i / lub unikania wyrażeń regularnych w ogóle. Jednak PHP i jego baza użytkowników ma kilka właściwości, które go łączą, i dlaczego widzimy na ten temat więcej pytań [potrzebne źródło!] I są tam „chorobliwie atrakcyjne”.
źródło
Ogólnie lubię wyrażenia regularne, dla których łatwiej je odczytać / zrozumieć niż 20 wierszy kodu, którymi musiałbym je zastąpić. Krótkie wyrażenia regularne są szybko odczytywane i rozumiane i są stosunkowo łatwe w utrzymaniu (jeśli wyrażenie się zmienia, masz tylko jedną linię do zmiany w porównaniu do przeglądania 20 linii kodu, aby dokonać zmiany). Są chwile, w których są niewłaściwie wykorzystywane, ale jest też wiele innych rzeczy.
Powodem, dla którego prawdopodobnie widzisz tak wiele nadużyć, jest to, że przeglądasz sekcję PHP StackOverFlow, ponieważ jestem pewien, że wiesz, że istnieje wielu niedojrzałych programistów PHP.
źródło
Dlaczego wyrażenia regularne są tak chorobliwie atrakcyjne?
Oni nie są. Są brzydkie jak diabli. I niezrozumiałe. Są obrzydliwością, którą należy zabić jak najszybciej.
Mówiąc to, wrócę do debugowania małej aplikacji Perla. Nic na to nie poradzę; niestety nadal są czasem najlepszym narzędziem do pracy.
źródło
Człowiek jest narzędziem używającym narzędzi, a wyrażenia regularne są potężnymi narzędziami. Dobrą metaforą wyrażeń regularnych jest krajalnica do mięsa z delikatesów. Jeśli chcesz cienkie jak papier plasterki indyka, peklowanej wołowiny itp., To jest właśnie to. Jednak potrzebujesz do tego wykwalifikowanych rąk, ponieważ możesz zranić się bardzo źle i nie poczujesz nic, dopóki nie zobaczysz krwi. Rozumiem przez to, że duży problem z wyrażeniami regularnymi polega na lekkim ich wyłączeniu, co oznacza, że dopasowujesz coś, czego nie powinieneś, lub odwrotnie, i nie dowiadujesz się, dopóki nie spowoduje to dalszych problemów w tym procesie.
źródło
Wyrażenia regularne są bardzo atrakcyjne, ponieważ posiadają moc. Możesz wykonać bardzo skomplikowaną pracę za pomocą kilku znaków.
Problem polega na tym, że standardowa konstrukcja wyrażeń regularnych nie jest kompletna w Turingu, co oznacza, że istnieją programy, których po prostu nie można zaimplementować za pomocą wyrażeń regularnych, a ludzie NIE WIEDZĄ tego, gdy są zwabieni przez pozorną moc wyrażeń regularnych.
To - jak sądzę - jest powodem cytatu jwz „teraz mają dwa problemy”.
Ja przypuszczam , że wyrażenia regularne Perl są Turinga kompletne, ale najwyraźniej to nie zostało udowodnione lub obalona zdecydowanie jeszcze.
źródło
Ponieważ jest to skuteczny sposób na zaprogramowanie skończonej maszyny stanów, która jest potężnym narzędziem, gdy ma zastosowanie. Jest to w zasadzie własny język programowania FSM, co jest pomocne, jeśli znasz język, irytujące, jeśli go nie znasz.
źródło
Z mojego doświadczenia wynika, że wyrażenia regularne są jak starożytna sztuka, coś niejasnego, niektórzy ludzie czują do nich urazę, ponieważ nie potrafią zrozumieć związanej z nimi magii i może dlatego, że nikt ci ich nie wyjaśni. Nie słyszałem o uniwersytetach, które uczą je czegoś mniej banalnego niż dopasowywanie wiadomości e-mail. Potem jest mistyczne wewnętrzne działanie, ponieważ większość ludzi ich nie rozumie, muszą być powolni . A sprawienie, by działały dobrze za pierwszym razem, zawsze stanowi wyzwanie dla początkujących.
To samo można powiedzieć o Perlu, awk, Linuksie i wszystkim, co nie ma błyszczących przycisków ani ładnej kolorowej składni. To jest jak złożoność „trywialnych zadań”, wystarczy rzucić kilka pętli, podzielić, przełącznik, trochę magii i to wszystko, co może działać. Ale cóż, jeśli jesteś po drugiej stronie drogi, wyrażenia regularne to piękne foremki do ciastek, które wyglądają jak szum sygnału bez żadnych nieprzyjemnych pętli lub innych rzeczy do debugowania. Lubię je również za elastyczność, którą zapewniają. Kiedy wzorzec pasujący do zmian zmienia się, po prostu zmieniasz wyrażenie regularne, a nie algorytm, narzędzie / cokolwiek, i jest to miłe i działa ponownie. A ponieważ są one magicznym ciągiem, możesz umieścić go poza kodem źródłowym, jeśli chcesz. I kolejna rzecz, która każe mi myśleć o perlu, jeśli napiszesz wyrażenie regularne, które ma ponad 20 znaków, wydaje się, że wiele osiągnąłeś, przynajmniej dla mnie jest tak schludny i kompaktowy. Jestem też leniwym programistą, nie lubię pisać dużo kodu z ładną identyfikacją i komentarzami oraz dodając kilka błędów do miksu.
źródło