Em Java, estou tentando retornar todas as correspondências de regex para uma matriz, mas parece que você só pode verificar se o padrão corresponde a algo ou não (booleano).
Como posso usar uma correspondência de regex para formar uma matriz de todas as strings que correspondem a uma expressão de regex em uma determinada string?
Respostas:
( A resposta do 4castle é melhor que a abaixo, se você puder assumir Java> = 9)
Você precisa criar um correspondente e usá-lo para encontrar correspondências iterativamente.
Depois disso,
allMatches
contém as correspondências e você pode usarallMatches.toArray(new String[0])
para obter uma matriz se realmente precisar de uma.Você também pode usar
MatchResult
para escrever funções auxiliares para fazer loop sobre correspondências, poisMatcher.toMatchResult()
retorna uma captura instantânea do estado atual do grupo.Por exemplo, você pode escrever um iterador lento para permitir que você faça
fazendo algo parecido com isto:
Com isso,
rendimentos
fonte
ArrayList
eLinkedList
, os resultados podem ser surpreendentes.allMatches
vsyourStringHere.length()
), provavelmente você pode pré-calcular um bom tamanho paraallMatches
. Na minha experiência, o custo daLinkedList
memória e da iteração em termos de eficiência geralmente não vale a pena, portantoLinkedList
não é minha postura padrão. Mas, ao otimizar um hot-spot, definitivamente vale a pena trocar as implementações da lista para ver se você obtém uma melhoria.Matcher#results
para obter umStream
que você pode usar para gerar uma matriz (veja minha resposta ).No Java 9, agora você pode usar
Matcher#results()
para obter umStream<MatchResult>
que você pode usar para obter uma lista / matriz de correspondências.fonte
Java torna o regex muito complicado e não segue o estilo perl. Dê uma olhada no MentaRegex para ver como você pode fazer isso em uma única linha de código Java:
fonte
Aqui está um exemplo simples:
(se você tiver mais grupos de captura, poderá consultá-los pelo índice deles como um argumento do método de grupo. Se precisar de uma matriz, use
list.toArray()
)fonte
Pattern.matches()
é um método estático, você não deve chamá-lo em umaPattern
instância.Pattern.matches(regex, input)
é simplesmente uma abreviação dePattern.compile(regex).matcher(input).matches()
.Das trilhas oficiais do Regex Java :
Use
find
e insira o resultadogroup
em sua matriz / Lista / qualquer que seja.fonte
fonte