Mam pewne skomplikowane wyrażenia regularne, które muszę skomentować dla czytelności i konserwacji. Specyfikacja Java jest dość lakoniczna i przez długi czas walczyłem o to. I wreszcie wpadła mi błąd i opublikować go jako odpowiedź ale byłbym wdzięczny za innych wskazówkach na utrzymanie regexesW tym komentarze w wyrażeniach regularnych Java
Jako przykład chcę komentować podskładniki (wzorców) w prosty parser nazwa:
String testTarget = "Waldorf T. Flywheel";
String patternS = "([A-Za-z]+)\\s+([A-Z]\\.)?\\s+([A-Za-z]+)";
Pattern pattern = Pattern.compile(patternS, Pattern.COMMENTS);
Assert.assertTrue(pattern.matcher(testTarget).matches());
EDYCJA: Byłbym wdzięczny także za przykłady formatu (? X).
EDYCJA: @ geowa4 ma dobrą sugestię, która pozwala uniknąć komentarzy osadzonych. Sinnce java i inni udostępnili osadzone komentarze, jakie są przypadki, w których są przydatne? (Myślę, że mam sprawę, ale chciałbym zobaczyć innych).
EDIT: Jak zaznaczono poniżej @mikej regex nie obsługuje opcjonalnego wstępnego dobrze i będzie lepiej jak:
String patternS = "([A-Za-z]+)\\s+([A-Z]\\.\\s+)?([A-Za-z]+)";
ale to skończyć wydobywania miejsca w początkowej
Dzięki - jest to przydatne podejście. Wskazano także na inny pomysł używania języków specyficznych dla domeny do generowania wyrażeń regularnych (http://flimflan.com/blog/ReadableRegularExpressions.aspx). (W rzeczywistości to robię w mojej aplikacji, która ma skomplikowane kombinacje skompresowanych wyrażeń regularnych dla danych naukowych, ale to wykracza poza zakres tego pytania). –
To jest bardzo czyste i schludne rozwiązanie. Chociaż opcjonalnyWhiteSpace powinien prawdopodobnie być obowiązkowyWhiteSpace? :) – crunchdog
Dzięki crunchdog. Myślę, że to, co mnie zaskoczyło, jest faktycznym ograniczeniem we wzorze w tym, że jeśli mamy nazwę bez środkowego inicjału takiego jak Fred Bloggs, to potrzebujemy 2 spacji między imieniem i nazwiskiem, aby dopasować dwa \ \ s + we wzorze. Próbowałem rozwiązać ten problem, ale na razie zredagowałem odpowiedź, aby uzyskać wzór równoważny z tym z OP. – mikej