2010-10-16 11 views
30

Jestem po prostu noobem jeśli chodzi o wyrażenie regularne. Wiem, że Perl jest niesamowity dzięki regexp i nie znam zbyt wiele Perla. Niedawno zacząłem uczyć się JavaScript i natrafiłem na wyrażenie regularne dla sprawdzania poprawności danych wprowadzanych przez użytkownika ... nie używałem ich zbyt wiele.Wyrejestrowanie JavaScript w porównaniu do Perl regex

W jaki sposób regexp JavaScript porównuje się z wyrażeniem regularnym Perla? Podobieństwa i różnice?
Czy wszystkie wyrażenia regularne zapisane w JS mogą być używane w Perlu i na odwrót?
Podobna składnia?

+1

Ciekawi mnie, czy ktoś to odpowie. Wiem, że podstawowa funkcja regex jest taka sama pomiędzy Perl i JavaScript (^ zakotwiczenia w lewo, $ zakotwiczenia w prawo, \ b w przypadku granicy słów, itd.). Niektóre zaawansowane funkcje mogą się jednak różnić, podobnie jak brak chciwego dopasowywania i tylne odniesienia. – jpsimons

Odpowiedz

22

Z ECMAScript 2018 naprawiono wiele niedostatków regexu JavaScript.

Co jeszcze brakuje:

  • JavaScript nie ma sposobu, aby zapobiec backtracking poprzez mecze końcowe (za pomocą zaborczy kwantyfikatorów ++/*+/?+ lub atomowe grupy (?>...)).
  • Dopasowanie rekurencyjne/zrównoważone podgrupy nie jest obsługiwane.
  • Inną (kosmetyczną) rzeczą jest to, że JavaScript nie zna pełnych wyrażeń regularnych, co może utrudnić ich czytanie.

Poza tym podstawowa składnia regex jest bardzo podobna w obu smakach.

+3

Można fałszować pełne wyrażenie regularne z łączeniem ciągów. To nie jest tak ładne, jak prawdziwe szczegółowe komentarze, więc bariera jest wyższa, gdy chcesz to zrobić, ale nadal jest to opcja i jest zdecydowanie warta zachodu w niektórych sytuacjach. –

+0

Stwierdzenia Lookbehind zostały dodane w ECMAScript 2018. – Jakob

6

Ten comparison odpowie na wszystkie twoje pytania.

+4

Z wyjątkiem, że jest około trzech lat nieaktualne, ponieważ obejmuje tylko Perl 5.8, a kilka rzeczy na tej liście zostały dodane w 5.10. – hobbs

+1

@hobbs - niektórzy z nas wciąż żyją w świecie 5.8 :) – DVK

+5

Aby być konkretnym (to znaczy, rzeczywiście pomocnym), 5.10 dodaje nazwane przechwytywania, nazywa się odnośnikami wstecznymi i "kwantyzatorami dzierżawczymi" za pomocą '+', a także niektóre inne rzeczy związane z kontrolowaniem wycofywania i analizą rekursywnego zejścia, której nie ma w tym porównaniu. – hobbs

5

Kolejna różnica: w JavaScript nie ma modyfikatora s: kropka "." nigdy nie będzie pasować do znaku nowej linii. Jako zamiennik dla ".", Klasa znaków [\s\S] może być użyta w JavaScript, który będzie działał jak /./s w Perlu.

+1

lub użyj klasy znaków '[^]' – irisjay

+1

Dodano modyfikator 's' w ECMAScript 2018. – Jakob

Powiązane problemy