2010-09-18 3 views
2

J'essaie de rendre mon code Scala un peu plus idiomatique. En ce moment, il ressemble à du code Java.Idiomatic regex matching dans Scala

Je suis en train de faire une simple fonction de correspondance des expressions rationnelles booléenne à Scala, car je ne peux pas sembler trouver dans la bibliothèque standard (?)

Je ne pense pas que le résultat est particulièrement agréable avec l'essai -catch et tout. En outre, une condition préalable est que 'patt' ait exactement un groupe, que je n'utilise pas vraiment pour quoi que ce soit. Toute entrée?

def doesMatchRegEx(subj:String, patt:scala.util.matching.Regex) = { 
    try{ 
     val Match = patt 
     val Match(x) = subj 
     true 
    } catch { 
     // we didnt match and therefore got an error 
    case e:MatchError => false 
    } 
} 

Utilisation:

scala> doesMatchRegEx("foo",".*(foo).*".r) 
res36: Boolean = true 

scala> doesMatchRegEx("bar",".*(foo).*".r) 
res37: Boolean = false 
+0

Voir aussi « Comment vérifier si une chaîne correspond entièrement à Scala Regex un » http://stackoverflow.com/questions/3021813/how-to-check-whether-a-string-fully-matches-a-regex-in-scala. – mkneissl

+0

Merci, c'est une belle discussion sur le sujet. – Grav

Répondre

9
def doesMatchRegEx(subj:String, patt:scala.util.matching.Regex) = subj match { 
    case patt(_) => true 
    case _ => false 
} 

Comme vous pouvez le voir, cela fait en fait la méthode « doesMatchRegEx sorte de superflu.

Comme le fait:

"foo".matches(".*(foo).*") // => true 
"bar".matches(".*(foo).*") // => false 
".*(foo).*".r.findFirstIn("foo").isDefined // => true 
+0

Dans mon désir d'utiliser Scala, j'ai complètement oublié que j'utilise java.lang.String et qu'il a une méthode matches. Merci pour cela :-) A propos du match-case-thing - aussi sympa, mais comme je le vois, je dois encore l'envelopper dans une méthode pour l'utiliser comme une expression booléenne - comment est-ce superflue? – Grav

+0

Puisque tout dans Scala rend quelque chose, le match le fait aussi. Vous pouvez donc écrire val b = subj match ... et b contiendra true/false. Si c'est ce que tu veux dire? –

+0

Oui, vous avez raison, le match pourrait simplement être utilisé à la place. Je n'ai pas compris ça au début. – Grav