Con bastante frecuencia comparo las cadenas con expresiones regulares. En Java:..Coincidencia con una expresión regular en Scala
java.util.regex.Pattern.compile ("\ w +") ("matcher this_is") coincide con
Ay. Scala tiene muchas alternativas.
"\\w+".r.pattern.matcher("this_is").matches
"this_is".matches("\\w+")
"\\w+".r unapplySeq "this_is" isDefined
val R = "\\w+".r; "this_is" match { case R() => true; case _ => false}
La primera es igual de peso pesado como el código de Java.
El problema con el segundo es que no puede suministrar un patrón compilado ("this_is".matches("\\w+".r")
). (Esto parece ser un anti-patrón ya que casi cada vez que hay un método que toma una expresión regular para compilar hay una sobrecarga que toma una expresión regular).
El problema con el tercero es que abusa de unapplySeq
y por lo tanto es críptico.
El cuarto es genial cuando se descomponen partes de una expresión regular, pero es demasiado pesado cuando solo quieres un resultado booleano.
¿Me está faltando una manera fácil de buscar coincidencias con una expresión regular? ¿Hay alguna razón por la cual String#matches(regex: Regex): Boolean
no está definido? De hecho, ¿dónde se define String#matches(uncompiled: String): Boolean
?
Vale la pena señalar que 'String # matches (string: String)' no está definido por la especificación 2.9 o [StringLike] (http://www.scala-lang.org/api/current/index.html # scala.collection.immutable.StringLike) escriba de la biblioteca estándar. Es, de hecho, un artefacto de la definición de [Strings in Java] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#matches (java.lang. Cuerda)). – ig0774
No entiendo lo que quiere decir con demasiado pesado en el primer ejemplo? ¿Quiere decir que el código es demasiado largo, o quiere decir que está haciendo demasiado trabajo? –
código demasiado, el trabajo es exactamente lo que quiero – schmmd