80 votes

Comment vérifier si une chaîne correspond parfaitement à un regex dans Scala?

Supposons que j'ai une Regex modèle que je veux pour correspondre à de nombreuses Chaînes.

val Digit = """\d""".r

Je veux juste vérifier si une Chaîne donnée entièrement correspond à l'expression rationnelle. Ce qui est une bonne et idiomatiques moyen de le faire dans Scala?

Je sais que je peux en correspondance du modèle sur les Regexes, mais ce n'est pas syntaxiquement très agréable dans ce cas, parce que je n'ai pas de groupes de l'extrait:

scala> "5" match { case Digit() => true case _ => false }
res4: Boolean = true

Ou je pourrais revenir à la sous-jacentes Java motif:

scala> Digit.pattern.matcher("5").matches
res6: Boolean = true

ce qui n'est pas très élégant non plus.

Est-il une meilleure solution?

64voto

mkneissl Points 2786

Répondant à ma propre question, je vais utiliser le "modèle de maquereau"

 object RegexUtils {
  class RichRegex(underlying: Regex) {
    def matches(s: String) = underlying.pattern.matcher(s).matches
  }
  implicit def regexToRichRegex(r: Regex) = new RichRegex(r)
}
 

et l'utiliser comme ça

 import RegexUtils._
val Digit = """\d""".r
if (Digit matches "5") println("match")
else println("no match")
 

à moins que quelqu'un propose une meilleure solution (standard).

Remarques

  • Je n’ai pas utilisé String pour limiter la portée des effets secondaires potentiels.

  • unapplySeq ne lit pas très bien dans ce contexte.

56voto

polygenelubricants Points 136838

Je ne connais pas très bien Scala, mais on dirait que vous pouvez le faire:

 "5".matches("\\d")
 

Références

13voto

Vasil Remeniuk Points 12487

Pour le match complet, vous pouvez utiliser unapplySeq . Cette méthode essaie de faire correspondre la cible (correspondance entière) et renvoie les correspondances.

 scala> val Digit = """\d""".r
Digit: scala.util.matching.Regex = \d

scala> Digit unapplySeq "1"
res9: Option[List[String]] = Some(List())

scala> Digit unapplySeq "123"
res10: Option[List[String]] = None

scala> Digit unapplySeq "string"
res11: Option[List[String]] = None
 

11voto

JacobusR Points 5865
  """\d""".r.unapplySeq("5").isDefined            //> res1: Boolean = true
  """\d""".r.unapplySeq("a").isDefined            //> res2: Boolean = false

1voto

Daniel C. Sobral Points 159554

La réponse est dans la regex:

 val Digit = """^\d$""".r
 

Ensuite, utilisez l'une des méthodes existantes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X