validar vacio simplificar regulares regular probar online expresiones expresion espacio ejemplos cualquier caracter blanco alfanumerico regex scala

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.

  1. "//w+".r.pattern.matcher("this_is").matches
  2. "this_is".matches("//w+")
  3. "//w+".r unapplySeq "this_is" isDefined
  4. 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?



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.