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,
allMatches
contiene las coincidencias y puede usarallMatches.toArray(new String[0])
para obtener una matriz si realmente necesita una.También puede usar
MatchResult
para 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
ArrayList
yLinkedList
los resultados pueden ser sorprendentes.allMatches
vsyourStringHere.length()
), probablemente pueda calcular previamente un buen tamañoallMatches
. En mi experiencia, el costo de laLinkedList
memoria y la eficiencia de iteración en términos de eficiencia no suele valer la pena, porLinkedList
lo 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#results
para obtener unoStream
que 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 unaPattern
instancia.Pattern.matches(regex, input)
es simplemente una abreviatura dePattern.compile(regex).matcher(input).matches()
.De los senderos oficiales de Java Regex :
Use
find
e inserte el resultadogroup
en su matriz / Lista / lo que sea.fuente
fuente