regex - vacio - simplificar expresiones regulares online
Coincidencia con una expresión regular en Scala (4)
Con bastante frecuencia comparo cadenas de caracteres con expresiones regulares. En Java:
java.util.regex.Pattern.compile ("/ w +"). matcher ("this_is"). coincidencias
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}
El primero es tan pesado como el código de Java.
El problema con el segundo es que no se puede suministrar un patrón compilado ( "this_is".matches("//w+".r")
). (Esto parece ser un antipatrón debido a que casi siempre hay un método eso 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 la aplicación de unapplySeq
y, por lo tanto, es críptico.
El cuarto es excelente cuando se descomponen partes de una expresión regular, pero es demasiado pesado cuando solo quieres un resultado booleano.
¿Me estoy perdiendo una forma fácil de buscar coincidencias con una expresión regular? ¿Hay alguna razón por String#matches(regex: Regex): Boolean
cual String#matches(regex: Regex): Boolean
no está definido? De hecho, ¿dónde String#matches(uncompiled: String): Boolean
definido?
Actualmente (agosto de 2014, Scala 2.11) @ La respuesta de David dice la norma.
Sin embargo, parece que el interpolador de cadenas r."..."
puede estar en camino para ayudar con esto. Consulte Cómo emparejar patrones con expresiones regulares en Scala?
Creé un pequeño patrón de "Pimp my Library" para ese problema. Tal vez te ayude.
import util.matching.Regex
object RegexUtils {
class RichRegex(self: Regex) {
def =~(s: String) = self.pattern.matcher(s).matches
}
implicit def regexToRichRegex(r: Regex) = new RichRegex(r)
}
Ejemplo de uso
scala> import RegexUtils._
scala> """/w+""".r =~ "foo"
res12: Boolean = true
Puede definir un patrón como este:
scala> val Email = """(/w+)@([/w/.]+)""".r
findFirstIn
devolverá Some[String]
si coincide o de lo contrario None
.
scala> Email.findFirstIn("[email protected]")
res1: Option[String] = Some([email protected])
scala> Email.findFirstIn("test")
rest2: Option[String] = None
Incluso puedes extraer:
scala> val Email(name, domain) = "[email protected]"
name: String = test
domain: String = example.com
Finalmente, también puede usar el método convencional String.matches
(e incluso reciclar el Email Regexp
previamente definido:
scala> "[email protected]".matches(Email.toString)
res6: Boolean = true
Espero que esto ayude
Usualmente uso
val regex = "...".r
if (regex.findFirstIn(text).isDefined) ...
pero creo que es bastante incómodo.