Piszę narzędzie Java, które pomaga mi generować mnóstwo danych do testowania wydajności. Byłoby naprawdę fajnie móc określić wyrażenie regularne dla Strings, tak aby mój generator wypluwał elementy, które pasują do tego. Czy jest już coś upieczonego, czego mogę użyć do tego? A może jest biblioteka, która prowadzi mnie tam przez większość drogi?
Dzięki
Odpowiedzi:
Edycja: jak wspomniano w komentarzach, w Google Code dostępna jest biblioteka umożliwiająca to: https://code.google.com/archive/p/xeger/
Zobacz także https://github.com/mifmif/Generex zgodnie z sugestią Mifmif
Wiadomość oryginalna:
Po pierwsze, sądzę, że przy wystarczająco złożonym wyrażeniu regularnym może to być niemożliwe. Ale powinieneś być w stanie złożyć coś razem dla prostych wyrażeń regularnych.
Jeśli spojrzysz na kod źródłowy klasy java.util.regex.Pattern, zobaczysz, że używa ona wewnętrznej reprezentacji instancji Node. Każdy z różnych składników wzorców ma własną implementację podklasy Node. Te węzły są zorganizowane w drzewo.
Tworząc gościa, który przemierza to drzewo, powinieneś być w stanie wywołać przeciążoną metodę generatora lub jakiś rodzaj Buildera, który łączy coś razem.
źródło
[\w]
. Spojrzenie na ostatnią linię ich wiki mówi nam o tym.dk.brics.automaton
więc przygotuj się na dodanie zależności pom innych firm. Większości ludzi to nie przeszkadza, ale chciałbym, żeby było coś bardziej kompaktowego.Jest za późno, aby pomóc oryginalnemu plakatowi, ale może to pomóc nowicjuszowi. Generex to przydatna biblioteka java, która zapewnia wiele funkcji do używania wyrażeń regularnych do generowania ciągów (generowanie losowe, generowanie ciągu na podstawie jego indeksu, generowanie wszystkich ciągów ...).
Przykład:
Ujawnienie
Projekt wspomniany w tym poście należy do użytkownika odpowiadającego (Mifmif) na pytanie. Zgodnie z zasadami należy o tym poruszyć.
źródło
Xeger (Java) również to potrafi:
źródło
W tym celu przeszedłem do korzeni mojej własnej biblioteki (w języku C #, ale powinno być łatwe do zrozumienia dla programisty Java).
Rxrdg powstał jako rozwiązanie problemu tworzenia danych testowych dla rzeczywistego projektu. Podstawową ideą jest wykorzystanie istniejących wzorców walidacji (wyrażeń regularnych) do tworzenia losowych danych zgodnych z takimi wzorcami. W ten sposób tworzone są prawidłowe dane losowe.
Nie jest trudno napisać parser dla prostych wzorców regex. Używanie abstrakcyjnego drzewa składni do generowania ciągów powinno być jeszcze łatwiejsze.
źródło
W podcastie 11 Stackoverflow:
Prawdopodobnie nie jest to to, czego szukasz, ale może to być dobry punkt wyjścia zamiast tworzenia własnego.
Nie mogę znaleźć niczego w Google, więc radziłbym rozwiązać ten problem, parsując dane wyrażenie regularne na najmniejsze jednostki pracy (\ w, [xx], \ d, itd.) I pisząc kilka podstawowych metod do obsługi te wyrażenia regularne.
Więc dla \ w miałbyś metodę getRandomLetter (), która zwraca dowolną losową literę, a także miałbyś getRandomLetter (char startLetter, char endLetter), która daje losową literę między dwiema wartościami.
źródło
To pytanie jest naprawdę stare, chociaż problem był dla mnie rzeczywisty. Próbowałem Xeger i Generex i wydaje się, że nie spełniają moich wymagań. W rzeczywistości nie potrafią przetworzyć niektórych wzorców regex (takich jak
a{60000}
) lub w przypadku innych (np.(A|B|C|D|E|F)
) Po prostu nie wytwarzają wszystkich możliwych wartości. Ponieważ nie znalazłem innego odpowiedniego rozwiązania - stworzyłem własną bibliotekę.https://github.com/curious-odd-man/RgxGen
Dostępny jest również artefakt na Maven Central.
Przykład użycia:
źródło
Wiem, że jest już zaakceptowana odpowiedź, ale korzystałem z generatora danych RedGate (tego, o którym mowa w odpowiedzi Craiga) i działa NAPRAWDĘ dobrze we wszystkim, co do niego rzuciłem. Jest to szybkie, a to sprawia, że chcę użyć tego samego wyrażenia regularnego do wygenerowania prawdziwych danych dla rzeczy takich jak kody rejestracyjne, które wypluwa.
Potrzeba wyrażenia regularnego, takiego jak:
i generuje mnóstwo unikalnych kodów, takich jak:
Czy to jakiś wielki tajny algorytm, który odkrył RedGate i wszyscy nie mamy szczęścia, czy może jest to coś, co moglibyśmy zrobić zwykli śmiertelnicy?
źródło
Lecę i właśnie zobaczyłem pytanie: napisałem najłatwiejsze, ale nieefektywne i niekompletne rozwiązanie. Mam nadzieję, że może ci to pomóc w rozpoczęciu pisania własnego parsera:
źródło
Będziesz musiał napisać swój własny parser, tak jak zrobił to autor String :: Random (Perl). W rzeczywistości nigdzie w tym module nie używa on wyrażeń regularnych, tylko do tego są przyzwyczajeni perl-koderzy.
Z drugiej strony, może możesz zajrzeć do źródła , aby uzyskać wskazówki.
EDYCJA: Cholera, Blair pobił mnie do pięści o 15 sekund.
źródło
Jest to dalekie od obsługi pełnego wyrażenia regularnego PCRE, ale napisałem następującą metodę Ruby, aby pobrać ciąg podobny do wyrażenia regularnego i utworzyć jego odmianę. (W przypadku CAPTCHA opartego na języku).
źródło
To pytanie jest bardzo stare, ale natknąłem się na nie podczas własnego wyszukiwania, więc dołączę kilka linków dla innych, którzy mogą szukać tej samej funkcji w innych językach.
źródło
Jeśli chcesz generować „krytyczne” ciągi, rozważ:
EGRET http://elarson.pythonanywhere.com/, który generuje „złe” ciągi obejmujące Twoje wyrażenia regularne
MUTREX http://cs.unibg.it/mutrex/ który generuje ciągi wykrywające błędy przez mutację regex
Oba są narzędziami akademickimi (jestem jednym z autorów tych ostatnich) i działają dość dobrze.
źródło