regex - probar - Grupo de captura de Scala usando expresiones regulares
expresiones regulares html (4)
Aquí hay un ejemplo de cómo puede acceder al group(1)
de cada partido:
val string = "one493two483three"
val pattern = """two(/d+)three""".r
pattern.findAllIn(string).matchData foreach {
m => println(m.group(1))
}
Esto imprime "483"
( como se ve en ideone.com ).
La opción lookaround
Dependiendo de la complejidad del patrón, también puede usar soluciones alternativas para que coincidan solo con la parte que desea. Se verá algo como esto:
val string = "one493two483three"
val pattern = """(?<=two)/d+(?=three)""".r
pattern.findAllIn(string).foreach(println)
Lo anterior también imprime "483"
( como se ve en ideone.com ).
Referencias
Digamos que tengo este código:
val string = "one493two483three"
val pattern = """two(/d+)three""".r
pattern.findAllIn(string).foreach(println)
Esperaba que findAllIn
solo devolviera 483
, pero en su lugar, devolvió two483three
. Sé que podría utilizar la unapply
para extraer solo esa parte, pero tendría que tener un patrón para toda la cadena, algo así como:
val pattern = """one.*two(/d+)three""".r
val pattern(aMatch) = string
println(aMatch) // prints 483
¿Hay alguna otra forma de lograr esto, sin usar directamente las clases de java.util
y sin usar la aplicación?
Si quiere ver el group(1)
, actualmente está mirando al group(0)
, que es "la secuencia completa".
def extractFileNameFromHttpFilePathExpression(expr: String) = {
//define regex
val regex = "http4.*///(//w+.(xlsx|xls|zip))$".r
// findFirstMatchIn/findAllMatchIn returns Option[Match] and Match has methods to access capture groups.
regex.findFirstMatchIn(expr) match {
case Some(i) => i.group(1)
case None => "regex_error"
}
}
extractFileNameFromHttpFilePathExpression(
"http4://testing.bbmkl.com/document/sth1234.zip")
val string = "one493two483three"
val pattern = """.*two(/d+)three.*""".r
string match {
case pattern(a483) => println(a483) //matched group(1) assigned to variable a483
case _ => // no match
}