Dlaczego wyrażenia regularne są tak chorobliwie atrakcyjne?

23

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_replacezamiast 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 )

cbrandolino
źródło
2
Możesz zacytować to, co faktycznie mówi instrukcja php.
ChrisF
1
Ponieważ są tajemnicze, więc chcesz należeć do ekskluzywnego klubu Kewl Kidz? I głównie dlatego, że zapewniają krótki sposób wyrażenia dopasowania lub ekstrakcji, do czego są stworzone. Jasne, że są to atrapy, niestandardowe parsowanie jest lepsze, ale czas poświęcony na napisanie szybkiego wyrażenia regularnego jest na korzyść wyrażenia regularnego.
haylem
Podkreśliłeś niewłaściwą część tego ostatniego zdania: oburzająca część to „z html”, a nie „w PHP”.
Izkata,

Odpowiedzi:

20

Dlaczego wyrażenia regularne są tak chorobliwie atrakcyjne?

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?

użytkownik8685
źródło
5
+1 - Drobna , tajemnicza rzecz, nie mniej.
AJ Johnson,
Hobity są podstępne
Ben
49

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)>)$

glenatron
źródło
16
Pokusa, by wybrać tę odpowiedź, jest tak silna, ale chyba muszę się oprzeć, ponieważ to moje pierwsze pytanie tutaj otwarte i muszę przez chwilę udawać powagę.
cbrandolino,
1
@Dev, ma to sens. Mój komentarz był tylko podobno zabawnym sposobem wyrażenia uznania dla odpowiedzi.
cbrandolino,
17
Co do licha to pasuje?
Tom O'Connor,
4
Nie wiem ... Myślę, że to wszystko podsumowuje. Jeśli znasz wyrażenia regularne i nie znasz innych metod, dlaczego miałbyś szukać? Masz już narzędzie, które prawidłowo wykonane poradzi sobie z zadaniem. Dopóki nie natkną się na prostszą metodę lub nie zostaną o niej poinformowani, regex będzie metodą typu catch-all, nawet jeśli będzie bardziej złożona niż to konieczne.
Aeo
4
@Tom O'Connor Wydaje mi się, że jest to coś zbliżonego do Regexu, jeśli chodzi o dopasowanie adresu e-mail RFC 2822, ale musiałem wyjąć kilka postaci, ponieważ siały spustoszenie przy obniżaniu cen.
glenatron
23

Myślę, że to dlatego, że:

  1. Są fantastycznie zwięzłe (przy prawidłowym użyciu) w porównaniu z równoważnym kodem, oraz
  2. Są szeroko obsługiwane we wszystkich językach programowania, więc większość programistów zna je.
hallidave
źródło
3
# 2 ma sens.
cbrandolino,
23

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.

Dan Ray
źródło
2
Nie mogę tego wystarczająco głosować.
CaffGeek,
8
Jestem ciekawy: czy czytasz wyrażenia regularne tak płynnie, jak je piszesz?
peterchen
7
Mam nadzieję, że organizujesz regularne sesje treningowe i / lub dokumentujesz swój kod; w przeciwnym razie tworzysz koszmar wsparcia dla swoich współpracowników. Czas zaoszczędzony na pisaniu tego wyrażenia regularnego może zostać stracony sto razy przez ludzi próbujących zrozumieć, co robi ten „elegancki wyrażenie regularne”.
Jeff Knecht,
3
Tak wspaniale W tych komentarzach można usłyszeć przeciąganie liny między kochaniem a nienawidzeniem wyrażeń regularnych.
Dan Ray
1
@Ben Lee: Chyba tak - OTOH, nigdy nie spotkałem się z komentowanym wyrażeniem regularnym na wolności. Niektóre problemy z wyrażeniami regularnymi mogą być oparte na postawie chłodu.
peterchen
16

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_matchwielokrotności strposi ifł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, np

W ostatnim przykładzie uświadomiłem sobie, że sprawdzanie, czy łańcuch jest małymi literami:

 if ($string == strtolower($string))

Jest bardziej czytelny niż:

 if (!preg_match("/[A-Z]/", $string))

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).

mario
źródło
1
Zgadzam się z twoim przykładem; nadal jednak w tym konkretnym przypadku wolałbym „strtolower ()”: w niekrytycznym kodzie optymalizacja czasu wykonania nawet tak dużej (w stosunku do innych implementacji) jest nieznaczna - chyba że chcesz ocenić małe litery - nie ma dużego pliku tekstowego, ale nie wyobrażam sobie, w którym przypadku byłoby to przydatne.
cbrandolino,
1
@cbrandolino: Brak dyskusji. Te rzeczy powinny być odpowiednie i oceniane tylko pod kątem zagnieżdżonych pętli, gdzie może to mieć znaczenie faktyczne.
mario
4
+1 Faktem jest, że ludzie zawsze walą ich, znacznie więcej, niż są obsługiwani.
Orbling
1
Jako jeden z „podstawników wyrażeń regularnych”: Fajnie jest widzieć, że jedna linijka mniej więcej wyraża, do czego „ręczny” ciąg analizuje nedds 30 linii. Jednak konserwacja cierpi na najbardziej realistycznych przykładach. Ponadto przy próbie zastosowania ich do nieważnych danych wejściowych wygenerowanie odpowiedniej diagnostyki dla danych odrzuconych wymaga dodatkowej akrobatyki. Dla mnie jest to prototypowy kod „tylko do zapisu” - fajny do szybkich skryptów i do długowiecznych aplikacji.
peterchen
1
Każdy, kto nie pisze wszystkich swoich wyrażeń regularnych w /xtrybie, 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 /@#$^^@#$^&&*)@#/.
tchrist
8

Wyrażenia regularne są bardzo atrakcyjne, ponieważ są najlepszym narzędziem do analizowania języka regularnego.

Mają następujące zalety:

  • zwięzłe . Na ogół potrzeba znacznie więcej kodu, aby przeanalizować konkretny język regularny przy użyciu określonego algorytmu, który wymyśliłeś, niż za pomocą wyrażenia regularnego.
  • szybkie w użyciu. Zasadniczo napisanie parsera dla określonego zwykłego języka zajmuje dużo więcej czasu, przy użyciu określonego algorytmu niż przy pomocy wyrażenia regularnego.
  • łatwe . Po opanowaniu zestawu znaków specjalnych i ich znaczenia łatwo jest skomponować wyrażenie regularne (choć nieco trudniej je odczytać). Regexps to same języki - przydatna cecha, ponieważ nasz gatunek ewoluował i jest bardzo dobry w języku.
  • szybkie . Po skompilowaniu mogą dopasować długość łańcucha Nw czasie O ( N).
  • elastyczne . Mogą pasować do dowolnego zwykłego języka, a wiele naszych danych jest wyrażonych jako zwykły język.
  • wszechobecne . Większość języków programowania ma podstawową obsługę wyrażeń regularnych - albo przez biblioteki zewnętrzne, albo wbudowane w sam język. Nie ma też zbyt dużych różnic między samymi językami wyrażeń regularnych.

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ż:

  • Nie rozumiem, że tego, co pasują, nie można wyrazić za pomocą wyrażenia regularnego (np. HTML).
  • Są leniwi (w złym sensie) - znają narzędzie i zdają sobie sprawę, że nie jest to najlepsze narzędzie do tego, co robią, ale zadziała bezproblemowo w 95% przypadków i zajmuje 95% wysiłku w nauce konkretnego parser lub pisanie jednego od zera.
  • Nie wiedzą, że istnieją lepsze narzędzia.
david4dev
źródło
Eee, miałem na myśli niektóre szczególne przypadki, w których najwyraźniej nie są najlepszym sposobem postępowania, ale są nadal stosowane. Lubię wyrażenia regularne (to znaczy, uważam je za nudne i pozbawione życia, ale wciąż bardzo przydatne w niektórych kontekstach) i wiem, jakie są ich zalety.
cbrandolino,
Zgadzam się z resztą, ale szybko i łatwo? Krzywa uczenia się jest stroma: dla początkującego trudno jest zrozumieć, dlaczego wyrażenie nie działa, a każda implementacja wyrażenia regularnego wydaje się mieć co najmniej subtelne różnice, więc musisz uważać, skąd się uczysz.
peterchen
Dlaczego wszyscy mylą wyciąganie małych kawałków HTML z całkowitą analizą pełnoprawnej strony internetowej w pełnym drzewie analizy? To jest naprawdę głupie. Uwierzcie mi, kiedy edytuję strony HTML vi, założycie się, że wykorzystam :%s/foo/bar/gcna tym swoje życie . Jeśli jest wystarczająco dobry dla edytora, jest wystarczająco dobry dla skryptu.
tchrist
6

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.

281377
źródło
4

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. :-)

Lennart Regebro
źródło
6
Jeśli chodzi o naszą historię ewolucyjną, jest to uzasadnione. Dopasowywaliśmy wzorce na długo przed zdefiniowaniem gramatyki lub odkryciem sylogizmów.
glenatron
1
Nie zgadzam się, programowanie obejmuje logikę i dopasowanie wzorców, dwa obszary. Regeksy są bardzo dobre w dopasowywaniu wzorców i powinny być używane do takich zadań. Zbyt powiedzenie „Nie lubię ich” oznacza odrzucenie dobrego narzędzia do konkretnej pracy.
Orbling
@Orbling: Pytanie nie dotyczy tego, czy są dobre czy złe, ale dlaczego niektórzy ludzie ich nadużywają, a inni nie.
Lennart Regebro
Pytanie może być, ale twoja odpowiedź sugeruje, że w grę wchodzi jeden lub drugi rodzaj umysłu, a nie oba.
Orbling
Nie sądzę, żeby „sugerować” to właściwe słowo.
Lennart Regebro
3

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ę ...?

WReach
źródło
2

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.

Michael Kohne
źródło
2

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:

  • PHP jest małą przyrodnią siostrą Perla . Integralną częścią Perla są wyrażenia regularne (wymyślili takie rzeczy, prawda?). Dlatego jest to jeden z powodów, dla których wyrażenia regularne są również rozpowszechnione w PHP.
  • Przypadek użycia PHP nie jest przypadkiem znacznie inaczej niż w przypadku wykorzystania do wyrażeń regularnych. PHP jest strukturalnie wykorzystywane do sklejania stron HTML. I wyrażenia regularne działają na tekście. (co powiedział WReach)
  • Micro optymalizacji . Jak wspomniano wcześniej: ludzie często używają wyrażeń regularnych i / lub ciągów PHP po odczuwanej prędkości. Podstawowy problem w kręgach PHP, nie specyficzny dla wyrażeń regularnych.
  • Wyrażenia regularne są wbudowane . W Pythonie, w Javie, w C #, w Ruby? jest dostępna, ale odstraszająca konieczność załadowania dodatkowego modułu. I zobacz, jak w PHP lub JavaScript, gdzie jest to podstawowa funkcja, wzorzec użytkowania jest różny. Kolejna ekspozycja: CSS, gdzie jest coraz częściej używany.
  • Podręcznik PHP jest winny. Często tak jest. Wyrażenia regularne są łatwe do odkrycia, a ja odłożyłem ten zabawny fakt, ponieważ jest nudny w swojej oczywistości: wszystkie cholerne samouczki i książki wprowadzające do PHP zawsze uczą o wyrażeniach regularnych, ale nie edukują na temat przypadków użycia.
  • API ciąg w PHP zaprojektowana przez tych samych ludzi, które doprowadziły Cię magiczne cytaty i namespace \ separator. Jest obejmujący, lepiej niż Java, ale nie jest efektowny w całości. W szczególności, jeśli łańcuchy mogą się podwójnie tworzyć jako obiekty (patrz Python), funkcje łańcuchowe mogą prześcignąć wyrażenia regularne.

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”.

Mario
źródło
1

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.

stoj
źródło
1

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.

wieża
źródło
4
Lubię powiedzieć, że wyrażenia regularne nie są ani „regularne”, ani „wyraziste”
Andrew Barber
2
Są brzydkie i niezrozumiałe, jeśli ich nie rozumiesz. Po osiągnięciu zen wyrażenia regularnego są one naprawdę dość eleganckie.
Dan Ray
1
-1 Za podjęcie decyzji, że wszyscy programiści lubią być niejasni, a następnie nie rozważa innych możliwych wyjaśnień. ... Pomogłoby wyjaśnienie, dlaczego uważasz, że są brzydkie lub niezrozumiałe.
Macneil,
1
@Macneil - Proszę (chociaż tak, moje przemyślenia są w tym kierunku), chyba że cytujesz mnie, nie stwierdzaj, że powiedziałem / zdecydowałem się na coś, czego nie zrobiłem (pierwsza część twojego komentarza). Jeśli chodzi o twoje pytanie, uważasz je za piękne ?! ... Ja nie. A ponieważ jest to strona subiektywna i jest to subiektywna opinia, nie muszę ani nie chcę o niej szczegółowo omawiać. W tym przypadku nie będę się starał.
Gawron
1
@Rook - Myślę, że większość ludzi patrzy na złożone wyrażenie regularne, decyduje, że wszystkie wyrażenia regularne są brzydkie, a potem przestaje myśleć. Faktem jest, że są bardzo eleganckim i wyrazistym narzędziem, jeśli możesz odrzucić swoje uprzedzenia na ich temat. BTW, według twojej logiki, wielu programistów nie potrafi robić algebry, więc algebra jest prawdopodobnie z natury zła i powinna zostać zniesiona, ponieważ jest wyraźnie niezrozumiała.
Dan Ray
0

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.

Larry Coleman
źródło
0

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.

użytkownik1249
źródło
0

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.

DanTilkin
źródło
0

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.

alfa64
źródło