2015-06-02 13 views
6

właśnie zaczęła doceniać wyrażenie regularne i ćwiczę je na regexone.com moje pytanie otrzymuje wyjaśnienie dotyczące kleene "*". Wpadłem odpowiedzi na własną rękę”Różnica z wyrażeniem Kleen regex

[a-c]* 

ale rozwiązanie to:?

aa+b*c+ or a*b*c* 

jest jakieś różnice pod względem zachowania z nimi szczególnie jeśli używam go z javascript

przepraszam za mój zły język angielski.

Odpowiedz

7

problemem jest niedostatecznie zdefiniowane, ponieważ nie istnieją negatywne przykłady.

Na przykład, jeśli zapytają Cię w szkole medycznej "jak nazywa się urządzenie, które amputuje", "samochód" jest technicznie poprawny, ale prawdopodobnie nie jest to, co chcieli usłyszeć (ponieważ wiele wypadków samochodowych kończy się na ludzie z odciętymi kończynami). Ale pytanie brzmiało: "Jak nazywa się instrument medyczny, którego użyłby do wykonania amputacji podczas operacji", odpowiedź nie może być już "samochodem".

Podobnie, twoje rozwiązanie będzie działać we wszystkich dostarczonych przypadkach, ale nie jest tak dokładne, jak jego. Na przykład: "cba" jest rozpoznawany przez twoje wyrażenie, ale jest odrzucany przez nich (przynajmniej nie jako dopasowanie całego ciągu; jest trywialnie dopasowany do "cba" jako dopasowanie o długości 0 w dowolnym miejscu ciągu, a jako 1-długości bit "a"). W związku z tym, .* jest również ważnym (ale całkowicie nieprecyzyjnym) rozwiązaniem ich problemu.

+0

czy możesz podać przykład, że moje rozwiązanie może się nie udać? Byłbym wdzięczny za naukę :) – loki9

+0

Nie może na ich przykładach. Jeśli mieli przykład, w którym powiedzieli, że "nie może on pasować do pustego ciągu", twoje rozwiązanie byłoby błędne; ale nie, więc tak nie jest. Pozwala jedynie na więcej rozwiązań niż ich rozwiązania. W rzeczywistości mówią nawet coś podobnego w trzecim akapicie. Gdzie widziałeś, że "rozwiązaniem jest" aa + b * c + "lub" a * b * c * ""? – Amadan

+0

pod polem tekstowym, w którym należy wprowadzić rozwiązanie. tam jest tekst mówiący "Rozwiąż powyższe zadanie, aby przejść do następnej lekcji lub przeczytaj Rozwiązanie." kliknij łącze rozwiązania – loki9

1

Nie ma różnicy w ogólnym wyrażeniu regularnym w JavaScript iw innych językach. Zadanie zasadniczo wymaga podania najbardziej restrykcyjnego wyrażenia regularnego pasującego do podanych wzorców. Dostarczają również alternatywnej odpowiedzi, aby pokazać, że możesz dopasować wzorzec także do mniej restrykcyjnego wyrażenia regularnego. Rzeczy szukać za pomocą dostarczonych wzorów są następujące:

  1. Istnieje zawsze pary a -s: aa, aaaa
  2. jest 0 lub więcej b -s: b, bbbb, nr b
  3. jest 1 lub więcej c na koniec: cc, c, cc
  4. litery zawsze są w następującej kolejności: abc

Istnieje wiele wyrażeń regularnych, które można wstawić w celu dopasowania tych czterech warunków, więc należy spróbować podać najbardziej restrykcyjny, aby zminimalizować dopasowania poza tymi przykładami. Wciąż nawet z podaną odpowiedzią dopasujesz nieskończenie wiele innych ciągów.

Jeszcze bardziej restrykcyjne regex byłoby:

^(aa)+b*c+$ 

Tutaj regex wymaga ciąg rozpoczyna się aa i kończy się c. Zakładam, że lekcje nadal nie zostały dostarczone do ^ i $, a zatem dostarczona odpowiedź nie zawiera tych.

+2

"Nie ma różnicy w zachowaniu' regex' w 'JavaScript' i innych językach" .. tak długo, jak trzymasz się podstaw, takich jak gwiazda Kleene. Z pewnością istnieją różnice w bardziej zaawansowanych możliwościach (zwłaszcza, że ​​JS nie obsługuje lookbehind, rekursywności, podprogramów, nazwanych przechwytów, warunków warunkowych ...) – Amadan

+0

@Amadan Miałem na myśli ogólnie i biorąc pod uwagę wystarczająco wczesny samouczek, który jest dostarczony. Jeśli odpowiedź brzmi dogłębnie, wyjaśniając wszystkie różnice, które można zaobserwować pomiędzy różnymi silnikami regex, odpowiedź stanie się zdecydowanie za długa. Masz rację, implementacja wprowadza różnice w silnikach, ale wciąż w czystej teorii obliczeniowej, wyrażenia regularne są równoważne skończonym automatom i są jednolite we wszystkich dziedzinach. –

+1

Tak, ale to, co ludzie na SO nazywają wyrażeniami regularnymi (i tym, co regexone ocenia) nie są teoretycznymi wyrażeniami regularnymi i wcale nie są one równoważne FA. Gdybyśmy byli na [CS.SE] (http://cs.stackexchange.com/), nie zrobiłbym tego komentarza. Ale twoja edycja ("ogólnie") jest wszystkim, czego chciałem - nie podoba mi się to, gdy ludzie okłamują uczących się ze względu na prostotę, ale dopóki mówią "nie tak naprawdę, ale nie musisz jeszcze znać szczegółów" to jest dobre. Zapobiega wszelkiego rodzaju dezorientacjom, gdy ktoś próbuje ocenić '/ (? <= A) b /' i wygląda na to, że "regexp WTF powinno być wszędzie takie samo!" – Amadan

Powiązane problemy