En Java, intento devolver todas las coincidencias de expresiones regulares a una matriz, pero parece que solo puede verificar si el patrón coincide con algo o no (booleano).
¿Cómo puedo usar una coincidencia de expresiones regulares para formar una matriz de todas las cadenas que coinciden con una expresión de expresiones regulares en una cadena dada?

Respuestas:
( La respuesta de 4castle es mejor que la siguiente si puede suponer Java> = 9)
Debe crear un emparejador y usarlo para encontrar coincidencias de forma iterativa.
Después de esto,
allMatchescontiene las coincidencias y puede usarallMatches.toArray(new String[0])para obtener una matriz si realmente necesita una.También puede usar
MatchResultpara escribir funciones auxiliares para recorrer las coincidencias ya queMatcher.toMatchResult()devuelve una instantánea del estado actual del grupo.Por ejemplo, puedes escribir un iterador perezoso que te permita hacer
haciendo algo como esto:
Con este,
rendimientos
fuente
ArrayListyLinkedListlos resultados pueden ser sorprendentes.allMatchesvsyourStringHere.length()), probablemente pueda calcular previamente un buen tamañoallMatches. En mi experiencia, el costo de laLinkedListmemoria y la eficiencia de iteración en términos de eficiencia no suele valer la pena, porLinkedListlo que no es mi postura predeterminada. Pero al optimizar un punto caliente, definitivamente vale la pena intercambiar las implementaciones de la lista para ver si obtiene una mejora.Matcher#resultspara obtener unoStreamque puede usar para generar una matriz (vea mi respuesta ).En Java 9, ahora puede usar
Matcher#results()para obtener unoStream<MatchResult>que puede usar para obtener una lista / matriz de coincidencias.fuente
Java hace que la expresión regular sea demasiado complicada y no sigue el estilo perl. Eche un vistazo a MentaRegex para ver cómo puede lograrlo en una sola línea de código Java:
fuente
Aquí hay un ejemplo simple:
(si tiene más grupos de captura, puede referirse a ellos por su índice como argumento del método de grupo. Si necesita una matriz, use
list.toArray())fuente
Pattern.matches()es un método estático, no debe llamarlo en unaPatterninstancia.Pattern.matches(regex, input)es simplemente una abreviatura dePattern.compile(regex).matcher(input).matches().De los senderos oficiales de Java Regex :
Use
finde inserte el resultadogroupen su matriz / Lista / lo que sea.fuente
fuente