Czy wiesz, dlaczego "wyrazy regularne" są nazywane "zwykłymi"? :-)
To byłoby zbyt długie, aby wytłumaczyć, po prostu zarysuję drogę. Aby dopasować wzorzec (to znaczy zdecydować, czy dany ciąg jest "prawidłowy" lub "nieprawidłowy"), teoretyczny informatyk użyłby finite state automaton. To abstrakcyjna maszyna, która ma skończoną liczbę stanów; przy każdym tiku odczytuje znak z wejścia i przeskakuje do innego stanu. Skala miejsca przeskakiwania z określonego stanu, gdy czytany jest dany znak, jest stała. Niektóre stany są oznaczone jako "OK", niektóre - jako "NIEPOWODZENIE", dzięki czemu sprawdzając stan maszyny, możesz sprawdzić, czy Twój tekst jest "ważny" (tj. Ważny e-mail).
Na przykład, maszyna ta przyjmuje tylko „nice” jako „ważny” słowo (PIC z Wikipedii):
Zestaw „ważny” słów taka maszyna teoretycznie można odróżnić od nieprawidłowy to "regular language". Nie każdy zbiór jest zwykłym językiem: na przykład, automaty skończone nie są w stanie sprawdzić, czy nawiasy w łańcuchu są zrównoważone.
Ale konstruowanie maszyn stanu było złożonym zadaniem, w porównaniu ze złożonością definiowania, co jest "poprawne". Tak więc matematycy (głównie S. Kleene) zauważyli, że każde regular language można opisać za pomocą "regular expression". Mieli *
s i |
s i były prototypami tego, co znamy teraz jako regexps.
Co to ma wspólnego z problemem?Problem w temacie jest zasadniczo nieregularny. Nie można go wyrazić za pomocą niczego, co działa jak automat skończony.
Najważniejsze jest to, że powinien zawierać komórkę pamięci zdolną do przechowywania dowolnej liczby (liczba powtórzeń w twoim przypadku). Automaty skończone i klasyczne wyrażenia regularne nie mogą tego zrobić.
Jednak współczesne wyrazy regularne są bardziej wyraziste i are said to be able to check balanced parentheses! Ale może to być dobrym przykładem, że nie powinieneś używać wyrażeń regularnych do zadań, które im nie odpowiadają. Nie mówiąc o tym, że zawiera fragmenty kodu; to sprawia, że wyrażenie nie jest "regularne".
Odpowiedzi na pierwsze pytanie, nie można rozwiązać problemu za pomocą niczego "zwykłego" tylko. Jednakże, wyrażenia regularne mogą być pomóc w rozwiązaniu tego problemu, jak w tster's answer
Być może należy szukać bliżej tster's answer (zrobić „+1” Nie, proszę!) I pokazać, dlaczego nie jest to „normalne wyrażenie "rozwiązanie. Można pomyśleć, że tak jest, zawiera on tylko instrukcję print (nieistotną), a koncepcja loop-and-loop jest kompatybilna z skończoną automatyczną ekspresją automatu stanu. Ale jest jeszcze jedna nieuchwytny rzecz:
while ($line =~ s/^([a-z]+)(\d+)//i)
{
print $1
x # <--- this one
$2;
}
Zadaniem czyta ciąg i numer i drukowanie wielokrotnie ten ciąg podano liczbę razy, gdzie liczba jest dowolną liczbą całkowitą, to cofnąć w stanie skończonej maszyna bez dodatkowej pamięci. Używasz komórki pamięci, aby zachować tę liczbę i ją zmniejszyć, i sprawdzić, czy jest ona większa od zera. Ale ta liczba może być arbitralnie duża i jest sprzeczna z skończoną skończoną pamięcią dostępną dla maszyny stanowej skończonej.
Jednak nie ma nic złego w klasycznym wzorze /([abc]*){5}/
, który pasuje do czegoś "regularnego" powtórzonego naprawiono liczbę razy. Zasadniczo mamy stany, które odpowiadają "dopasowanemu wzorowi raz", "dopasowanemu wzorowi dwa razy" ... "dopasowanemu wzorowi 5 razy". Jest ich skończona liczba i to jest istotna różnica.
Nie jestem odpowiedzią, ale nie mogłem się oprzeć, cytując to: "Niektórzy ludzie, w konfrontacji z problemem, myślą:" Wiem, użyję wyrażeń regularnych ". Teraz mają dwa problemy. " - Jamie Zawinski –
Ten cytat z Jamie Z jest jednym z moich ulubionych. – APC
Pascal MARTIN - Chciałbyś mnie oświecić, dlaczego mają dwa problemy? (Naprawdę chcę wiedzieć). ---- O tym pytaniu, myślę, że RegEx wygląda mi dobrze i nie wygląda na to, żeby pasowało do "a1b". Jesteś pewien, Siddhant? – NawaMan