W Javie próbuję zwrócić wszystkie dopasowania wyrażeń regularnych do tablicy, ale wydaje się, że możesz tylko sprawdzić, czy wzorzec pasuje do czegoś, czy nie (boolean).
Jak mogę użyć dopasowania wyrażenia regularnego, aby utworzyć tablicę wszystkich ciągów pasujących do wyrażenia regularnego w danym ciągu?
Odpowiedzi:
( Odpowiedź 4castle jest lepsza niż poniżej, jeśli możesz założyć, że Java> = 9)
Musisz utworzyć dopasowanie i użyć go do iteracyjnego znajdowania dopasowań.
Następnie
allMatches
zawiera dopasowania i możesz użyćallMatches.toArray(new String[0])
do pobrania tablicy, jeśli naprawdę jej potrzebujesz.Możesz również użyć
MatchResult
do napisania funkcji pomocniczych do zapętlenia dopasowań, ponieważMatcher.toMatchResult()
zwraca migawkę bieżącego stanu grupy.Na przykład możesz napisać leniwy iterator, który pozwoli ci to zrobić
robiąc coś takiego:
Z tym,
plony
źródło
ArrayList
iLinkedList
wyniki mogą być zaskakujące.allMatches
vsyourStringHere.length()
), prawdopodobnie możesz wstępnie obliczyć dobry rozmiarallMatches
. Z mojego doświadczeniaLinkedList
wynika , że koszt pamięci i wydajności iteracji zwykle nie jest tego wart, więcLinkedList
nie jest to moja domyślna postawa. Ale podczas optymalizacji punktu aktywnego zdecydowanie warto zamienić implementacje list, aby zobaczyć, czy uzyskasz poprawę.Matcher#results
aby uzyskać,Stream
którego możesz użyć do wygenerowania tablicy (zobacz moją odpowiedź ).W Javie 9 możesz teraz użyć,
Matcher#results()
aby uzyskaćStream<MatchResult>
listę / tablicę dopasowań.źródło
Java sprawia, że regex jest zbyt skomplikowany i nie jest zgodny ze stylem perla. Spójrz na MentaRegex, aby zobaczyć, jak możesz to osiągnąć w jednej linii kodu Java:
źródło
Oto prosty przykład:
(jeśli masz więcej grup przechwytywania, możesz odwołać się do nich przez ich indeks jako argument metody group. Jeśli potrzebujesz tablicy, użyj
list.toArray()
)źródło
Pattern.matches()
to metoda statyczna, nie należy jej wywoływać wPattern
instancji.Pattern.matches(regex, input)
jest po prostu skrótem dlaPattern.compile(regex).matcher(input).matches()
.Z oficjalnych tras Regex Java :
Użyj
find
i wstaw wynikgroup
do swojej tablicy / listy / cokolwiek.źródło
źródło