Me gustaría poder encontrar una coincidencia entre la primera letra de una palabra y una de las letras de un grupo como "ABC". En pseudocódigo, esto podría parecerse a algo como:
case Process(word) =>
word.firstLetter match {
case([a-c][A-C]) =>
case _ =>
}
}
Pero, ¿cómo tomo la primera letra en Scala en lugar de Java? ¿Cómo expreso la expresión regular correctamente? ¿Es posible hacer esto dentro de una clase de caso ?
[a-cA-C]
para esa expresión regular.Traversable
(me gustaList
yArray
), si desea los primeros 3 caracteres, intente"my string".take(3)
, para el primero"foo".head
Respuestas:
Puede hacerlo porque las expresiones regulares definen extractores, pero primero debe definir el patrón de expresiones regulares. No tengo acceso a un REPL de Scala para probar esto, pero algo como esto debería funcionar.
fuente
val Pattern = "[a-cA-C]".r
no funcionará. Esto se debe a que utiliza casos de coincidenciaunapplySeq(target: Any): Option[List[String]]
, que devuelve los grupos coincidentes.val r = "[A-Ca-c]".r ; 'a' match { case r() => }
. scala-lang.org/api/current/#scala.util.matching.Regexval r = "([A-Ca-c])".r ; "C" match { case r(_*) => }
.Desde la versión 2.10, se puede usar la función de interpolación de cadenas de Scala:
Aún mejor, uno puede unir grupos de expresiones regulares:
También es posible establecer mecanismos de enlace más detallados:
Un ejemplo impresionante de lo que es posible
Dynamic
se muestra en la publicación del blog Introducción a Type Dynamic :fuente
$
signo como patrón de final de línea: el compilador se queja de la falta de terminación de cadena.case p.firstName.lastName.Map(...
patrón, ¿cómo puedo leer eso?Regex
cada vez que se verifica la coincidencia. Y esa es una operación bastante costosa que implica la compilación del patrón regex.Como señaló Delnan, la
match
palabra clave en Scala no tiene nada que ver con expresiones regulares. Para averiguar si una cadena coincide con una expresión regular, puede usar elString.matches
método. Para saber si una cadena comienza con a, b o c en minúsculas o mayúsculas, la expresión regular se vería así:Puede leer esta expresión regular como "uno de los caracteres a, b, c, A, B o C seguido de cualquier cosa" (
.
significa "cualquier carácter" y*
significa "cero o más veces", por lo que ". *" Es cualquier cadena) .fuente
Para ampliar un poco la respuesta de Andrew : El hecho de que las expresiones regulares definan extractores se puede usar para descomponer muy bien las subcadenas emparejadas por la expresión regular utilizando la coincidencia de patrones de Scala, por ejemplo:
fuente
[]
), el símbolo de intercalación indica negación, por lo que[^\s]
significa "sin espacios en blanco".String.matches es la forma de hacer coincidir patrones en el sentido de expresiones regulares.
Pero como un práctico a un lado, word.firstLetter en código Scala real se ve así:
Scala trata las cadenas como una secuencia de Char, por lo que si por alguna razón desea obtener explícitamente el primer carácter de la cadena y combinarlo, puede usar algo como esto:
No estoy proponiendo esto como la forma general de hacer una coincidencia de patrón de expresiones regulares, pero está en línea con su enfoque propuesto para encontrar primero el primer carácter de una Cadena y luego compararlo con una expresión regular.
EDITAR: Para ser claros, la forma en que haría esto es, como otros han dicho:
Solo quería mostrar un ejemplo lo más cerca posible de su pseudocódigo inicial. ¡Salud!
fuente
"Cat"(0).toString
podría escribirse más claramente como"Cat" take 1
, en mi humilde opinión.val r = "[A-Ca-c]".r ; "cat"(0) match { case r() => }
.Tenga en cuenta que el enfoque de la respuesta de @ AndrewMyers hace coincidir la cadena completa con la expresión regular, con el efecto de anclar la expresión regular en ambos extremos de la cadena usando
^
y$
. Ejemplo:Y sin un
.*
al final:fuente
val MY_RE2 = "(foo|bar)".r.unanchored ; "foo123" match { case MY_RE2(_*) => }
. Más idiomáticamente,val re
sin mayúsculas.Primero debemos saber que la expresión regular se puede usar por separado. Aquí hay un ejemplo:
En segundo lugar, debemos notar que combinar la expresión regular con la coincidencia de patrones sería muy poderoso. Aquí hay un ejemplo simple.
De hecho, la expresión regular en sí misma ya es muy poderosa; lo único que debemos hacer es hacerlo más poderoso con Scala. Aquí hay más ejemplos en el documento Scala: http://www.scala-lang.org/files/archive/api/current/index.html#scala.util.matching.Regex
fuente