Jak uczysz się wyrażeń regularnych? [Zamknięte]

80

Nie pytam, gdzie się uczyć. Znalazłem wiele dobrych zasobów online, książek itp.

Ale jak, u licha, radzę sobie z nimi. Gdzie jest początek, koniec? Kiedy procesor wyrażeń regularnych przesuwa się nad tekstem, kiedy utrzymuje swoją pozycję i próbuje innego dopasowania? itp.

Mam ochotę wymyślić hieroglify na egipskich piramidach.

dumbBoy
źródło
2
Sortuj na temat - regularne - wyrażenia.info . Skorzystaj z tego i sugestii @ Jalayna poniżej. Ucz się, robiąc!
Freiheit
6
gskinner.com/RegExr to najlepsze narzędzie do opracowywania wyrażeń regularnych, jakie znalazłem.
Callum Rogers,
Trochę na raz. Zacznij od prostych rzeczy („aaa”, „aa.”, „A * b” itd.) I pracuj aż do komponentów specyficznych dla implementacji (np. PCRE). Następnie wymyśl wzór i spróbuj utworzyć wyrażenie pasujące do niego.
tylerl
Nauczyłem się metodą prób i błędów we wspaniałym programie RegexBuddy. regexbuddy.com (Nie mam uznania za reklamę tego, ten program naprawdę ułatwił naukę)
Yam Marcovic
rubular.com to dobre narzędzie do tworzenia wyrażeń regularnych .
Gazler

Odpowiedzi:

68

Myślę, że znajomość teorii automatów ma kluczowe znaczenie dla zrozumienia.

Kiedy zrozumiesz, czym jest automat i jak zdefiniowane są języki regularne , zrozumienie wyrażeń regularnych będzie znacznie łatwiejsze.

Co do konkretnej składni i różnic między różnymi implementacjami ... Cóż, niektóre rzeczy trzeba tylko pamiętać. Są na to również pomoce .

Edytować

Niektóre z poniższych komentarzy podniosły ważne kwestie:

  1. Nie zapominaj, że wyrażenia regularne (zaimplementowane w większości języków programowania) są nadzbiorem wyrażeń regularnych w teorii automatów. Chociaż dobre przygotowanie teoretyczne jest użytecznym miejscem na początek, nie powie ci wszystkiego. (Dzięki, David Thornley)

  2. Wielu komentujących mówi, że można nauczyć się różnych składni wyrażeń regularnych bez uczenia się podstaw teoretycznych. Chociaż prawdą jest, że możesz nauczyć się składni bez pełnego zrozumienia, jak to działa, miałem wrażenie, że pełne zrozumienie jest tym, czego chciał OP. Pytanie dotyczyło rzeczywistej podstawy: kiedy procesor się rozwija? Kiedy to się skończy? Jak decyduje, że pasuje? To jest podstawa, to jest teoria i jest oparta na Teorii Automatów. Jasne, możesz prowadzić samochód, nie wiedząc, jak działa silnik. Ale jeśli jest pytanie „w jaki sposób gaz rzeczywiście sprawiają, że dysk” - ty musisz mówić o tym, jak silnik jest zbudowany, prawda?

littleadv
źródło
Komentatorzy: jeśli chcesz omówić drobniejsze punkty tego pytania, skorzystaj z czatu . W przeciwnym razie rozważ pozostawienie odpowiedzi lub głosowanie na odpowiedzi, które uważasz za najbardziej poprawne.
Dzięki za edycję. To sprawia, że ​​ta odpowiedź jest znacznie bliższa prawdy. Chociaż nadal nie sądzę, że naprawdę musisz znać teorię automatów (nie wiem tego, ale wciąż potrafię pisać złożone wyrażenia regularne), zgadzam się, że pewna znajomość teorii może pomóc. Zwłaszcza wiedza o tym, jak działa backtracking i jest kontrolowana przez kwantyfikatory chciwe / nieszlachetne / zaborcze, może naprawdę pomóc w zrozumieniu.
NikiC
Tylko moje 2 centy: w ostatnim serialu wideo na temat biblioteki wyrażeń regularnych C ++ STL w kanale 9 MSDN prezenter, który jest również opiekunem STL, powiedział, że zaimplementowali go jako automaty. Zatem znajomość tej teorii powinna naprawdę dać OP pewien wgląd w to, jak działa regex.
korbes
5
W ogóle nie zgadzam się z oświadczeniem otwierającym. Kiedy nauczyłem się wyrażeń regularnych, nie wiedziałem nic o teorii automatów. Trzy dekady później nadal tego nie robię. Wiedziałem, jak czytać stronę podręcznika, brać to dosłownie i jak eksperymentować w mgnieniu oka.
Bryan Oakley
1
@Bryan well ... Twoje doświadczenie potwierdza to. Być może wiesz, jak go używać , ale tak naprawdę nie rozumiesz, jak to działa. Jeśli tak, to wiesz coś o teorii automatów, nawet jeśli nie wiesz, jak to nazwać. Ale nie możesz w pełni zrozumieć wyrażeń regularnych bez znajomości teorii automatów i żadna ilość stron podręcznika man nie może ci w tym pomóc (chyba że czytasz strony podręcznika wyjaśniające teorię automatów).
littleadv
36

Ćwicząc.

Nauczyłem się, dobrze się bawiąc ze skrobaniem stron internetowych. Jestem pewien, że nie byłem sam, robiąc to dla zabawy.

Jeden przykład: napisz kod, który pobiera najnowsze wyniki piłkarskie, tenisowe (sport, który lubisz) ze swojej ulubionej strony sportowej. Zrób to, pisząc kod do załadowania strony, wyodrębnij wyniki z wyrażeniami regularnymi i wyślij je do konsoli lub pliku tekstowego. Upewnij się, że za pomocą wyrażenia regularnego wybierasz tylko wyniki i nic więcej. Czasami może to być dość trudne :-)

Drugi przykład: napisz kod, który pobiera obraz twojego ulubionego komiksu (na przykład bardzo lubię Sinfest ) i który przechowuje go gdzieś na twoim dysku twardym. Do pobierania znacznika „img” i jego zawartości używaj tylko wyrażeń regularnych. Opcjonalnie odzyskaj także jego tytuł, jeśli gdzieś jest przechowywany.

Jalayn
źródło
15
Parsowanie HTML za pomocą wyrażeń regularnych jest ogólnie złym pomysłem.
Maxpm
10
Oczywiście to zły pomysł. Używanie parserów DOM / Sax lub innych dedykowanych czytników XML powinno być używane „ogólnie”. Ale ten temat dotyczy nauki wyrażeń regularnych i podzieliłem się tym, jak dowiedziałem się o wyrażeniach regularnych w sposób, który moim zdaniem był „zabawny”.
Jalayn
3
Używanie parserów XML dla stron HTML jest jeszcze gorszym pomysłem niż skrobanie ich wyrażeniami regularnymi.
skolima
8
Ach cóż, chciałem sprecyzować, co o tym pomyślałem, ale byłem leniwy i właśnie zareagowałem na komentarz ... Myślę, że wszyscy możemy się zgodzić, że 1. użycie wyrażeń regularnych do analizy całego dokumentu jest złym pomysłem 2. Używanie parserów XML do parsowania HTML jest złym pomysłem 3. Używanie parserów XML do parsowania XHTML ma rację 4. Używanie wyrażeń regularnych do pobierania jednowierszowych lub pewnych bardzo szczegółowych informacji z HTML jest poprawne. Albo mogę to po prostu podsumować: odpowiednie narzędzie do właściwej pracy ...
Jalayn,
23

Wiem, że nie prosisz o zasoby, ale opanowanie wyrażeń regularnych przez Jeffreya EF Friedla było tym, jak dowiedziałem się, jak działają i jak z nich korzystać. Nawet po tym, jak wykorzystałem wiele z nich do parsowania różnych rzeczy, pierwszy rozdział miał dla mnie nowe rzeczy.

Chcesz zrozumieć te cholerne wyrażenia regularne? Przeczytaj tę książkę.

Arkh
źródło
2
To powinna być ostateczna odpowiedź.
szczupły
1
+100 000 Jedna z najlepszych książek technicznych w historii i wygodnie na temat pytania.
Affe
Uwielbiałem tę książkę. Kluczową kwestią jest to, że pomogło mi zrozumieć wszystkie różne funkcje dostępne w Regex. Nie będziesz w stanie zapamiętać całej składni z czytania książki, ale książka pokaże ci wszystkie rzeczy, które istnieją, abyś wiedział, jakie narzędzia musisz rozwiązać, gdy się pojawi.
Kibbee
Absolutnie +1 dla tej odpowiedzi. Wymachiwałam wyrażeniem regularnym, aż w końcu usiadłam i przeczytałam ten niezbędny tom wiersz po wierszu. Teraz Friedl dał mi wystarczająco dużo podstaw, żebym potrafił uzasadnić wszystkie niestandardowe odmiany, które nas dzisiaj trapią! Bardzo polecam to odniesienie OP i wszystkim innym. +1 do @slim za komentarz, również!
John Tobler,
19

Gdzie jest początek, koniec? Kiedy procesor wyrażeń regularnych przesuwa się nad tekstem, kiedy utrzymuje swoją pozycję i próbuje innego dopasowania? itp.

Zacznę od wyjaśnienia twoich celów, a następnie zastanowienia się nad twoim stylem uczenia się .

Uderzyło mnie to, że pytasz „jak mam się uczyć wyrażeń regularnych?” a następnie natychmiast odpowiedz na pytanie: „jak silnik wyrażeń regularnych działa wewnętrznie?” Wydaje się, że sugerujesz, że te dwie rzeczy mają ze sobą coś wspólnego, co jest znaczącym punktem. Może jesteś osobą, która uczy się, jak coś działa, rozkładając go na części lub samemu budując.

W przypadku aplikacji dla początkujących zwykle nie trzeba rozumieć, jak działa narzędzie, aby móc z niego skutecznie korzystać. Nie musisz wiedzieć, jak działa silnik wiertarki, aby wykonać otwory w drewnie; musisz zrozumieć, jak korzystać z wiertła, a nie jak zbudować wiertło.

Więc jaki jest twój cel? Czy chcesz nauczyć się budować silnik wyrażeń regularnych? czy masz zamiar nauczyć się, jak skutecznie używać wyrażeń regularnych do rozwiązywania problemów biznesowych? Osiągnięcie tych różnych celów prawdopodobnie wymaga różnych technik uczenia się.

Aby odpowiedzieć na konkretne pytanie dotyczące działania silnika wyrażeń regularnych: zależy. „Klasyczne” teoretyczne podejście do wyrażeń regularnych polega na użyciu wyrażenia regularnego jako schematu niedeterministycznego automatu skończonego, a następnie zbudowaniu równoważnego deterministycznego automatu skończonego, a następnie wykonaniu tego automatu na podstawie danych wejściowych.

Prawie nikt tak naprawdę nie robi tego z kilku powodów. Po pierwsze, liczba stanów pomnożona przez liczbę możliwych znaków wejściowych daje tabelę przejścia stanu, która jest cholernie ogromna nawet dla małych wyrażeń regularnych. Jasne, większość z nich można skompresować, ale wciąż jest wiele reguł przejścia. Po drugie, inne podejścia są zwykle szybsze. Po trzecie, tak zwane „wyrażenia regularne” znajdują się we współczesnych bibliotekach wyrażeń regularnych, nic w tym rodzaju. W ogóle nie są to zwykłe języki; są często rozpoznawane przez automaty wypychające, a nie skończone języki automatów.

(Zacząłem pisać długą serię o tym, jak to wszystko działa, ale zabrakło mi pary po zaledwie pierwszych dwunastu artykułach . Być może zainteresują Cię krótkie informacje na temat teoretycznych podstaw podstawowych wyrażeń regularnych).

Zamiast tego w prawdziwych silnikach wyrażeń regularnych stosuje się strategię cofania. Silnik wyrażeń regularnych, który zbudowaliśmy dla silnika JScript ponad dekadę temu, teraz kompiluje wyrażenie regularne w języku kodu bajtowego, który zawiera operacje podstawowe do rozpoznawania sekwencji i powrotu do wcześniejszych stanów. Następnie zbudowaliśmy interpreter dla tego języka kodu bajtowego.

Nie starałbym się zrozumieć, jak działa silnik wyrażenia regularnego, zanim miałbym dość solidne zrozumienie, jak używać wyrażeń regularnych. Skoncentruj się na tym, zanim zaczniesz zagłębiać się w strategie optymalizacji różnych różnych silników.

Eric Lippert
źródło
+1, ponieważ odnosisz się do kilku rzeczy, o których warto wiedzieć, używając wyrażeń regularnych; Nie zgadzam się jednak z twoim zdaniem, że nie trzeba znać wnętrza. Do wiercenia masz całkowitą rację; w komputerach odkryłem, że wcześniej niż myślę, doszedłem do punktu, w którym muszę zrozumieć coś wewnątrz, aby opanować jego aplikację - czy to C ++ (kompilatory), serwery WWW (HTTP), czy wyrażenia regularne (teoria automatów) . Nie do tego stopnia, że ​​zostanę ekspertem, ale dobre zrozumienie podstawowych zasad jest często najszybszym sposobem na naukę.
Felix Dombek
3
@ Felix: Myślę, że się zgadzamy. Powiedziałem, że dla początkujących aplikacji jest zwykle nie ma potrzeby, aby zrozumieć, jak to narzędzie działa w celu wykorzystania go. Te słowa łasicy były celowe. Jeśli chodzi o czeladnika lub mistrzowskie użycie narzędzia, bardzo pomocne jest zrozumienie przynajmniej części jego wewnętrznych elementów, aby można było dokładnie przewidzieć, gdzie narzędzie będzie miało słabą wydajność, powiedzmy.
Eric Lippert,
Hmm, musiałbym się trochę nie zgodzić. Niektóre z najbardziej użytecznych programów biznesowych, które zbudowałem, wykorzystały teorię, której nauczyłem się w leksykach i yacc, do skutecznego rozwiązywania problemów. Masz rację, pełne zrozumienie na poziomie doktora nie jest konieczne. Będę musiał przeczytać posty na blogu, wyglądają najciekawiej.
Spencer Rathbun,
Mówisz, że wyrażenia regularne nie są regularne - ale myślałem, że świat regularny w nazwie odnosi się do wyrażeń, które pasują - np. Wyrażenie regularne, "[0-9]{3}"które może pasować do dowolnej trzycyfrowej liczby, a trzycyfrowa liczba 480 jest przykładem wyrażenia regularnego wyrażenia, które pasują.
konfigurator
1
@configurator: „Zwykły” język jest z definicji językiem rozpoznawalnym przez automat skończony. Każdy język regularny może charakteryzować się „wyrażeniem regularnym” składającym się tylko ze związków, alternatyw, catenacji i gwiazdy Kleene. Ale obecnie większość mechanizmów „wyrażeń regularnych” rozpoznaje bardziej złożone języki niż zwykłe języki; na przykład język „zdań z poprawnie dopasowanymi nawiasami” nie jest regularny, ale w niektórych silnikach wyrażeń regularnych można dopasować go do „wyrażenia regularnego”.
Eric Lippert,
6

Jak do cholery mam je rozwiązać?

Jak każda nowa rzecz:

10 Study
20 Practice
30 goto 10

Badanie

Uważam, że najbardziej udani nauczyciele zaczynają uczyć dowolnego przedmiotu, najpierw zapewniając mu trochę tła. Ważne jest, aby mieć kontekst tego, czego się uczysz i, co najważniejsze, dlaczego się tego uczysz.

Wszystko pasuje do ciągów

Wyrażenia regularne są sposobem dopasowania wzorców w tekście. Jest to sam język deklaratywny włączony do wielu innych języków programowania.

Chciałbym podkreślić, że jest to język deklaratywny, wyrażenia regularne są przydatne do wyrażania tego, co ciąg pasuje, ale tak nie jest w żaden sposób wyrazić , jak program ma zabrać dopasowanie. Z tego powodu można używać wyrażeń regularnych bardzo szybko i bardzo powoli w tym samym języku programowania, po prostu używając innego parsera RegEx.

Powód tworzenia wyrażeń regularnych jest taki sam przy tworzeniu większości języków programowania: programiści wielokrotnie powtarzali to samo skomplikowane zadanie i zdecydowali, że chcą prostszego sposobu pisania kodu.

Niektórzy będą (i powinni) narzekać na moje poprzednie zdanie, mówiąc coś w stylu:

RegEx nie upraszcza programu.

to prawda

RegEx nie upraszcza programu, RegEx ułatwia pisanie programu. Nadal musisz być dokładny w testowaniu, aby mieć pewność, że wszystkie poprawne przypadki są poprawnie dopasowane, a wszystkie niepoprawne przypadki nie. Naprawdę trudno jest przetestować „wszystko”, a przy skomplikowanych wzorach naprawdę trudno jest przetestować „większość”. W najgorszym przypadku powinieneś nadal testować „niektóre” przypadki.

uwzględnijmy kilka przykładów Obowiązkowo wybrałem silnik RegEx JavaScript, ponieważ mogę go łatwo przetestować na żywo w przeglądarce i ponieważ nie będę musiał robić żadnych znaków ucieczki podczas używania literałów RegEx.

Podczas normalnego dopasowywania łańcucha testowana jest jedna wartość łańcucha względem drugiego. Mogą pochodzić z dowolnego miejsca, ale w końcu porównuje się dwa łańcuchy:

if ( 'foo' == 'bar' ) doSomething();

Ten przykład jest do kitu, ponieważ nigdy nic nie da

if ( foo == 'bar' ) doSomething();

Dużo lepiej; teraz nie wiemy z góry, czy coś zostanie zrobione. Możemy teraz zacząć akceptować dane wejściowe użytkownika:

if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();

Wspaniale, teraz użytkownicy mogą wprowadzać dane bari coś się stanie, dopóki nie otrzymasz od użytkowników raportów o błędach, które mówią, że "bar"to nie działa lub że „BAR” nie działa lub że napisali BRA100 razy i nic się nie dzieje.

Ignorując błędy ortograficzne i dodatkowe znaki, 'bar' != 'BAR'a programiści muszą wymyślić sposób na sprawdzenie, czy postacie są niewłaściwe.

Proste rozwiązanie, użyj toLowerCase. Działa to wspaniale, ale co z naszymi użytkownikami, którzy używają brytyjskiego angielskiego zamiast amerykańskiego angielskiego podczas dopasowywania something == 'color'? Teraz będziesz musiał dopasować something == 'color' || somthing == 'colour'.

Krótka historia, proste wzory bardzo szybko zamieniają się w wiele powtarzalnych kodów.

Przykład koloru można po prostu dopasować do:

/colou?r/.test( something )

solidne zrozumienie podstaw wyrażeń regularnych może znacznie skrócić czas wymyślania nowego koła.

Gdzie studiować

Większość języków, które implementują wyrażenia regularne, ma co najmniej jeden zasób dostępny dla określonej składni użycia wyrażeń regularnych w tym języku. Jeden dla JavaScript można znaleźć w MDN

Przeczytaj to.
wszystko.
następnie przeczytaj to jeszcze raz.

Nauczenie się zajmuje trochę czasu, pomyśl o tym jak o inwestycji: godzina nauki RegEx oszczędza teraz godzinę, gdy następnym razem będziesz musiał dopasować ciąg znaków, a następnie kolejną godzinę następnym razem.

Ćwiczyć

Po przeczytaniu wszystkiego o RegEx, prawdopodobnie nie zrozumiesz większości z nich. To dlatego, że tak naprawdę nic z tym nie robisz .

Wspomniałem, dlaczego wybrałem JS w tym przykładzie, wzywam do zepsucia go w przeglądarce. Jest szybki i możesz to zrobić bezpośrednio na pasku adresu URL.

JS ma kilka różnych i prostych sposobów korzystania z RegEx:

string.match( regex )
regex.exec( string )
regex.test( string )

Począwszy od czegoś prostego, takiego jak:

javascript:'color'.match(/colou?r/);

jest łatwym sposobem na postawienie stopy w drzwiach. Graj z nim, rozbij, aby zobaczyć, które pasują, a co nie.

Kiedy utkniesz w praktyce, kontynuuj 30. Musisz przeczytać, aby dowiedzieć się więcej, ale musisz poćwiczyć, aby naprawdę zrozumieć to, czego się nauczyłeś.

zzzzBov
źródło
+1 za zalecanie bałaganu za pomocą JavaScript w przeglądarce.
John Tobler
5

Brian Kernighan pisze prosty procesor reg-ex w książce Beautiful Code . Zdaję sobie sprawę, że nie szukasz zasobów, ale może pomóc zobaczyć podstawową implementację od wewnątrz.

Michael Easter
źródło
Wspomniany „procesor wyrażeń regularnych” w rzeczywistości nie implementuje zakłóceń, a przy danym podejściu bardzo trudno je dodać. Lubię książkę, ale to jedna rzecz, z której byłem rozczarowany.
Felix Dombek
4

W normalnym rozwoju kod debugowania może zapewnić bardzo przydatne informacje. Wyrażenia regularne nie różnią się niczym. Tak więc, ryzykując, że brzmi jak reklama, zdobądź RegexBuddy . Ma świetne narzędzie do wizualnego wyświetlania tego, co robi silnik, gdy obsługuje wyrażenie i ciąg wejściowy.

John Fisher
źródło
1
+1, „Regex Hero” też jest fajny: regexhero.net/tester
Angelo
Regexbuddy to jedno z moich ulubionych narzędzi. Widok drzewa jest niezwykle pomocny, podobnie jak możliwość natychmiastowego przetestowania podczas generowania wyrażenia regularnego. Nauczyłem się o wiele więcej wyrażeń regularnych, nie próbując się tego nauczyć, używając go.
Chao
1
Zawsze uważałem RegexBuddy za interesujący, ale nie lubię go kupować. Do podstawowych testów wyrażenia regularnego istnieje wiele innych narzędzi. Aby zobaczyć tekstowy opis wyrażenia regularnego, istnieje mniej narzędzi. Robi to również płatna wersja Regex Hero. Jedną rzeczą raczej unikalną dla RegexBuddy jest Debuger Regex, który pokazuje każdą akceptację lub odrzucenie postaci oraz każdy powrót w szczegółach sprawdzających szczegóły, co może naprawdę pomóc przy debugowaniu dużego i bardzo skomplikowanego wyrażenia regularnego. Nie zauważyłem żadnego innego narzędzia, które to robi.
Kevin Cathcart,
3

Wyrażenia regularne mogą bardzo szybko się skomplikować, dlatego polecam zacząć je od ćwiczeń. Wiedz, że najprostszą formą wyrażenia regularnego jest ciąg reprezentujący to, czego szukasz. Niestety, aby móc zdefiniować specjalne reguły wyszukiwania, wymaga pewnych znaków, które muszą być poprzedzone znakami ucieczki, w przeciwnym razie utworzysz nieprawidłowe lub niepoprawne wyrażenie regularne.

Radzę zacząć od przykładu czegoś, czego szukasz i uciec od tego. Innymi słowy, jeśli szukasz czegoś w nawiasach, weź przykład jednego z takich ciągów w wyszukiwanym tekście: (this is an example of something you'd want to find)

Zacznij od znaków ucieczki, aby wyszukać dosłowny znak: \(this is an example of something you'd want to find\)

Przetestuj go, sprawdź, czy poprawnie znajduje Twój przykład. Następnie uogólnij wyrażenie, aby znaleźć taki tekst, a nie tylko znaleziony przykład. Więc stałoby się wtedy: \([^)]*\) (oznacza każdą postać, która nie jest „)” dla dowolnej liczby wystąpień, w tym 0).

Przetestuj go jeszcze raz i sprawdź, czy nie tylko znajduje on twój przykład, ale także innym. Wyszukaj w Internecie bardziej skomplikowane, ale częstsze wyrażenia regularne i załataj je przy użyciu istniejących wyrażeń regularnych, aby uniknąć martwienia się o każdą możliwość.

O to chodzi. I och, ucz się i kochaj \ Q ... \ E. W większości języków wyrażeń regularnych \ Q wskazuje początek literału i \ E oznacza koniec, na wypadek, gdybyś musiał zająć się wyszukiwaniem szczególnie wyrafinowanych wzorów i nie wiesz, jak z nich uciec. To uratowało mi życie więcej niż kilka razy.

Neil
źródło
3

Dam ci prostą odpowiedź na proste pytanie. Najpierw musisz zrozumieć, czym są Wyrażenia regularne (RegEx) - co robią, do czego są używane. To świetne narzędzie na początek.

  1. Co to jest? RegEx to język do wyrażania dopasowania wzorca. To znaczy, używając go, możesz stworzyć kombinację znaków, które rozpoznają lub znajdą wzorce w tekście. Jak to jest przydatne? Podczas programowania możesz powiedzieć komputerom, aby dopasowały tekst z jakiegoś źródła (dane wprowadzone przez użytkownika, stronę internetową itp.) I wykryły, czy w nim zawarte są określone wzory tekstu. Na przykład kropka (.) Reprezentuje dowolny znak - literę lub cyfrę. Liczby w nawiasach oznaczają liczby iteracji, więc „. {1,30}” oznacza dowolny znak, powtarzany od 1 do 30 razy - innymi słowy, nie możesz mieć pustego ciągu i nie może on być dłuższy niż 30 postacie. I tak dalej.

  2. Jak rozpocząć naukę? Absolutnie najlepszym narzędziem, jakie widziałem, jest Expresso , ale jest tylko dla systemu Windows. Ma bardzo rozbudowane GUI, w którym klikasz elementy, które chcesz dodać do wyrażenia, a następnie tester, aby sprawdzić go pod kątem różnych danych wejściowych, aby zobaczyć wyniki. Nie widziałem nic dobrego na Macu (ale używam Windowsa na VMWare, więc tak naprawdę nie potrzebuję wersji Maca), nie spędziłem dużo czasu na szukaniu Linuksa.

Jay Imerman
źródło
1
Dzięki za wskazówkę na temat Expresso. Wypróbowałem to i jest niesamowite!
Jim In Texas
3

Oprócz dobrych referencji, sposobem, w jaki naprawdę się uczysz, jest używanie dobrych narzędzi do nauki. Jednym z nich jest otwarty edytor Vim z dwiema ustawionymi opcjami:

  1. : ustaw incsearch ... podczas wpisywania wzorca wyszukiwania w wierszu poleceń edytor w locie przeskakuje do pierwszego pasującego tekstu i podświetla dokładnie to, co pasuje. Jeśli wpiszesz coś, co sprawia, że ​​już nie pasuje, Vim przeskakuje kursorem z powrotem do miejsca, w którym byłeś na początku.
  2. : set hlsearch ... to mówi Vimowi, aby pokazał podświetlone tło na całym tekście, który pasuje do bieżącego wyszukiwania RE.

Drugim jest użycie bezpłatnego wywołania narzędzia RegExCoach . Wklejasz tekst, który chcesz wyszukać, a następnie w innym oknie rozwijasz wyrażenie regularne. Podobnie jak Vim, wyróżnia udane mecze na bieżąco.

Firstrock
źródło
RegExCoach jest teraz shareware. Uważam, że jest to bardzo pomocne w opracowywaniu złożonych RE w stylu Perla.
Firstrock
2

Zaczynasz od podstawowego porównania ciągów znaków. Bardzo łatwe, ale też nie tak potężne.

Następnie mogło ci się przydać, że potrzebujesz rozróżniania wielkości liter, aby „grecki” i „GreeK” były równe. To jest nieco mocniejsze.

Pewnego dnia zauważysz, że niewielkie różnice w pisowni nie powinny przeszkadzać w porównywaniu dwóch słów w równości: tzn. „Organizuj” i „organizuj” powinny być równe. Siadasz i piszesz kod, który to robi i jesteś szczęśliwy.

Dopóki trochę więcej nie streścisz i nie zdasz sobie sprawy, że czasami chcesz, aby wszystkie słowa, które kończą się na „ize”, porównywały się z ich braćmi w brytyjskiej pisowni. Lub powtórzenia niektórych ciągów znaków określoną liczbę razy. I oczywiście musisz to wszystko połączyć.

I tak dalej. Wreszcie, najprawdopodobniej skończysz z jakąś notacją, w której nie każda postać reprezentuje się sama. Nic innego nie jest wyrażeniem regularnym. Można to postrzegać jako opis zestawu ciągów.

A potem jest to dość łatwe i sprowadza się do następujących 3 podstawowych zasad:

Masz podstawowe wyrażenia regularne: znaki, które oznaczają same siebie, klasy znaków, przydatne i niezbyt przydatne skróty dla klas znaków, takich jak \ d lub \ p {Lu} dla wielkich liter.

A potem masz kilka możliwości ich połączenia: jeśli r1 i r2 są wyrażeniami regularnymi, to także r1r2 r1 | r2 (r1).

Last but not least modyfikatory powtórzeń: r? r * r + r {n, m}

To wszystko, co musisz wiedzieć. Wszystko, co możesz wyszukać, kiedy jest to potrzebne.

Ingo
źródło
2

Dwie dobre inne odpowiedzi podpowiadają, aby nauczyć się teorii wyrażeń regularnych i ćwiczyć, które są świetną radą. Polecam także uzyskanie dobrego wizualnego narzędzia do wyrażenia regularnego, które pomoże ci, jeśli mówisz poważnie.

Na przykład RegexBuddy ma tryb wizualnego debugowania, który pozwala przejść przez wykonanie wyrażenia regularnego i pokazuje za pomocą wyróżnień i tekstu wyjaśniającego, co robi silnik wyrażenia regularnego na każdym kroku. Na ich stronie znajduje się film demonstrujący to debugowanie .

Steven
źródło
2

Wszystko, co możemy Ci dać, to więcej zasobów do nauki. To pytanie jest zasobem.

Nawiasem mówiąc, dość łatwo nauczyłem się wyrażeń regularnych z tej strony: http://www.regular-expressions.info/

Thiago Negri
źródło
1

Dla mnie zobaczenie, co pasuje do wyrażenia regularnego, gdy go buduję, naprawdę ułatwia moje życie i pomaga mi je lepiej zrozumieć.

Aby to zrobić, otworzę plik z tekstem docelowym w Emacsie, a następnie użyję isearch-forward-regexppolecenia. Po wejściu do wyrażenia regularnego Emacs pokazuje ci, co pasuje (to jest część „isearch”).

Aby uruchomić polecenie, w Emacsie możesz użyć <ESC>xisearch-forward-regexp.

jwernerny
źródło
1

Nauczyłem się wyrażeń regularnych, ucząc się flex i bizona, które są używane do budowy analizatorów leksykalnych i parserów. Nie można mieć parsera bez wyrażeń regularnych, a leksykon i yacc są niesamowicie dobre w przechodzeniu przez teorię bez poruszania się zbyt szybko.

Zasadniczo praktycznie wszystkie silniki regex w tych dniach są zgodne z tymi samymi zasadami. Wszystkie są maszynami skończonymi i jeśli naprawdę tego nie rozumiesz, masz przewagę nad prawie każdym pisanym kodem. Podobnie jest z uczeniem się rekurencji w tym, że gdy ją dostaniesz, instynktownie zastosujesz ją do problemów. Łatwo je rozwiązać za pomocą odpowiedniego narzędzia, ale bez niego bardzo trudne.

Kolejną rzeczą w nauce leksykonu i yacc, w porównaniu do wyrażeń regularnych, jest to, że uczysz się, jak działają one wewnętrznie. Jak program wygląda na przyszłość, dlaczego kończy dopasowanie, jak przechowuje dane i wiele więcej. Zrozumienie wskaźników jest absolutną koniecznością, ale jeśli zdobędziesz leksyk i yacc i przejdziesz je od samego początku, nauczysz się wszystkiego, o co prosiłeś, i będziesz mieć potężne narzędzie do końca swojej kariery.

To pytanie obejmuje wiele zasobów do nauki oraz elastyczny szkielet, który rzuciłem razem.

Spencer Rathbun
źródło
1

Wcześniej staram się upewnić, że nie ma prostszego sposobu rozwiązania problemu / „tokenizacji” ciągu.

Kiedy nie możesz go znaleźć, patrzę na to jako problem polegający na tym, że nie próbujesz dopasować tego, co chcesz z ciągu, a raczej chodzi o to, żeby NIE dopasować tego, czego nie chcesz. Wynika to głównie z tego, że wyrażenia regularne są zachłanne. Ale dobrze mi to służyło jako sposób na uzyskanie tego, czego chcę.

Oto przykład:

string = "Sep 22 19:57:38 host fcron[9137]: \
          Job fbsetbg -r $HOME/backgrounds/ \
          started for user user (pid 9138)"

dopasować minutę:

string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/                 # correct and good

Zamiast próbować znaleźć czas wraz ze wszystkim innym, spróbuj znaleźć wyraźne granice.

Przykład jest nieco wymyślony, ale wszystko, co mogłem wymyślić.

frogstarr78
źródło
1

Jednym z moich podejść było znalezienie wielu projektów open source, które wymagały aktualizacji składni, a następnie napisanie coraz bardziej złożonego skryptu sed, który składał się z wielu wyrażeń regularnych.

Skrypt musiał działać na wielu różnych plikach w każdym projekcie open source. Następnie możesz uruchomić wiele różnych projektów o różnych stylach. Zacząłem od czegoś tak prostego, jak %s/before/after wtedy, i stwierdziłem, że pasuje do zbyt wielu przypadków. więc dodałem więcej rzeczy, aby temu zapobiec. Potem znalazłem różne projekty wykorzystujące różne style składni, które wymagały różnych zmian.

W końcu skończyłem z

  • świetne umiejętności i wiedza na temat wyrażeń regularnych
  • dobre umiejętności z sed
  • pomoc w wielu projektach open source
  • otrzymuję dużo aktywności z wkładu pokazanej na moim profilu github
  • kolejne dobre narzędzie „szwajcarskiego noża wojskowego” do wirtualnego paska narzędzi

i pomogło w tym podejściu konieczność

  • osiągać rzeczywiste cele bez oszukiwania
  • wykorzystywać (regex) umiejętności jako część większego celu z większą motywacją.
  • być w stanie pokazać dowód umiejętności, których się nauczyłem, zmieniając kod innych osób, a następnie sprawdzając zmiany.

Przekażę również, że istnieje wiele stron dla różnych języków - ruby, javascript itp., Które pozwolą ci bawić się wyrażeniami i przykładowym tekstem w celu natychmiastowej satysfakcji. To są:

wyrażenia regularne w wielu językach na jednej stronie

skup się na grupach meczowych:

Michael Durrant
źródło
0

Znalazłem uczenie się wyrażeń regularnych podobnych do uczenia się tabliczki mnożenia - tak, musisz zrozumieć idee, które się za tym kryją, ale ostatecznie musisz to robić często i wielokrotnie.

Kiedy się uczyłem, stawiałem sobie za cel wykonywanie kilku ćwiczeń regularnych dziennie. W praktyce oznaczało to co najmniej raz dziennie, próbowałem spojrzeć na ciąg lub tekst na ekranie i wymyślić wyzwanie - „czy mogę stąd wyciągnąć wszystkie adresy e-mail” lub „znaleźć wszystkie wystąpienia słowa „kod” użytego jako czasownik zamiast rzeczownika, „takie rzeczy”.

Robiąc to przez kilka tygodni naprawdę się opłaciło - i oczywiście potrzebne są okresowe przeglądy i odświeżacze. Jestem o jeden za jeden.

Uznałem też, że to narzędzie online jest pomocne, ponieważ pozwala mi przetestować wyrażenia regularne w czasie rzeczywistym: http://www.gethifi.com/tools/regex

Philip Schweiger
źródło