2008-10-31 8 views
11

Czy w swoich wyrażeń regularnych użyłeś czasowników kontrolujących zwrotne Perl 5.10? I jakie problemy pomogli ci osiągnąć?Czy używałeś czasowników kontrolujących zwrotne Perl 5.10 w swoich wyrażeń regularnych?


Tak samo jak tło: Zrobiłem trochę skrzypiec, ale nie mogę uzyskać naprawdę użytecznych wyników.

Dla porównania, gdy zacząłem uzyskiwać to, co zrobiło grupowanie (?>, zaczęło się pojawiać więcej w moich wyrażeń regularnych. Spodobał mi się pomysł dostosowania świata Perl regex do konkretnego zestawu założeń. W miarę jak języki RE stają się bardziej widoczne, cofanie się sprawiło, że wydajność RE była bardzo rozbieżna w stosunku do szczupłej i średniej FSA, na której bazowali.


Kiedy ktoś może mi powiedzieć co inne wdrożenie OZE ma backtracking czasowniki kontroli - i PCRE nie, mogę przyznać, że należy w ogólnym obszarze wiedzy osób znających temat regexes. To jest pytanie w stylu regex z Perl, a faceci pomagający ludziom z Ruby, Pythonem, C#, Javascriptem - lub dowolnymi implementacjami klienta PCRE - prawdopodobnie nie mogą pomóc lub postrzegają go jako marnowanie przestrzeni na tagi, które normalnie czytają .

+0

Czy trzeba utworzyć tag dla [perl-regex]? –

+1

Pod tagiem regex znajduje się zbyt wiele wpisów dotyczących implementacji. Niektórzy mówią "tylko Java" lub "In C#, ...." Tak mnie denerwuje, o ile mi wiadomo, tylko Perl ma te czasowniki, więc jest to specyficzne dla Perla. – Axeman

+0

Nie widzę, jak "odpowiedzi na pytanie będą prawie całkowicie oparte na opiniach" to nawet wiarygodna krytyka. Prezentowana aplikacja używa czasowników regularnych lub nie działa albo nie działa w sposób podobny do "rozwiązań" prezentowanych innym pytaniom. To, czy rozwiązuje * znaczny * dostateczny problem, podlega również temu samemu rodzajowi subiektywizmu, jaki sam system głosowania obejmuje, decydując, czy dobrze "rozwiązanie" pasuje do tego pytania. – Axeman

Odpowiedz

2

Tak, mam, chociaż nie za dużo. Używam ich do kontrolowania cofania, zwykle w celu wymuszenia na nich większej liczby permutacji. Oto amusing solution i tutaj jest practical one.

+1

W końcu, uczę się używać niektórych czasowników regex. Dzięki tobie, a także dzięki temu, co wydaje się być rozszerzoną sekcją ('perlre') [http://perldoc.perl.org/perlre.html) (ale może to też ty), faktycznie wymyśliłem tę alternatywę RE dla drugiego rozwiązania: 'qr {x (* PRUNE) (a? B? C?) (? (? {$ 1}) | (* FAIL))} x'. – Axeman

1

Szczerze mówiąc, jeszcze nie użyłem jeszcze 5.10. Podobnie jak niektóre nowe funkcje, używam ich tylko w osobistych skryptach. W przypadku produkcji celuję w zgodność z 5.8. Dla CPAN celuję na 5.6. To powstrzymało mnie od grania z większością nowych zabawek.

Funkcje kontroli wstecznej są interesujące, ale nie widzę wielu aplikacji poza parserami. Nie wyobrażam sobie wypychania całego parsera do pojedynczego regexu. (Nawet jeśli teraz wspierają rekursję!) Jestem bardziej podekscytowany gramatyką Perl6.

+0

Zgadzam się na gramatykę. Ale czasowniki dają nam teraz trochę tego. – Axeman

+1

Robią to, ale wydaje się, że to raczej zwiastun niż jakakolwiek natychmiast użyteczna. Jest też niewiele takich "OSTRZEŻENIE: Te wzorce są eksperymentalne i mogą ulec zmianie lub usunięciu ..." zastrzegają w perlre. –

+0

5.10.0 to minimalna wersja, którą programuję do tych dni. Po prostu zbyt trudne jest robienie rozsądnych rzeczy wcześniej. Potrzebuję go dla lepszego wsparcia dla regex i lepszej obsługi Unicode. – tchrist

2

Minęły lata, odkąd zrobiłem programowanie Perla, więc nawet nie wiedziałem o tej funkcji, dopóki o tym nie wspomniałeś. Wygląda to na jedną z tych hardcore'owych cech, z których korzystaliby tylko guru regex (oczywiście społeczność Perla ma ich wiele). Z drugiej strony Perl 6 Grammars wygląda na bardzo zabawnego.

Na razie jestem zadowolony z grup atomowych i kwantyzatorów zaborczych. Właściwie jestem praktycznie uzależniony od nich. Doprowadziło to do punktu, w którym odruchowo próbuję napisać wyrażenia regularne w taki sposób, że nigdy się nie wycofają. Muszę sobie czasem przypomnieć, że cofanie się jest w porządku w małych dawkach i nie jest warte wysiłku, aby go całkowicie wyeliminować.

p.s. O ile mi wiadomo, kwantyfikatory dzierżawcze obsługiwane są tylko przez język Java, PCRE (PHP, Apache, Flex 3/ActionScript 3) oraz silnik regex JGSoft używany przez RegexBuddy, EditPad Pro i PowerGrep.

Aktualizacja:

aktualizacja: Smak Oniguruma (używany w Ruby 1.9+ i TextMate) obsługuje zarówno grupy atomowe, jak i kwantyzatory dzierżawcze. Oczywiście Perl 5.10 obsługuje je dodatkowo do czasowników kontrolujących zwrotne.