2010-09-18 16 views
2

我試圖讓我的Scala代碼更加地道。現在它看起來像Java代碼。Scala中的習慣性正則表達式匹配

我試圖做Scala中的一個簡單的布爾正則表達式匹配功能,因爲我似乎無法找到它的標準庫(?)

我不認爲結果是特別好的與試和所有。另外,一個先決條件是'patt'只有一個組,我並不真正使用它。任何輸入?

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 
    } 
} 

用途:

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

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

參見「?如何檢查一個字符串是否完全匹配Scala中的一個正則表達式」 http://stackoverflow.com/questions/3021813/how-to-check-whether-a-string-fully-matches-a-regex-in-scala。 – mkneissl 2010-09-19 11:52:32

+0

謝謝,這是一個很好的話題討論。 – Grav 2010-09-20 11:56:46

回答

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

正如你可以看到,這實際上使「doesMatchRegEx方法那種多餘的。

至於做這個的:

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

在我急於使用Scala時,我完全忘記了我正在使用java.lang.String並且它有一個matches-method。感謝那:-)關於match-case-thing - 也很好,但是當我看到它時,我仍然需要將它包裝在一個方法中,以將它用作布爾表達式 - 它是多餘的? – Grav 2010-09-18 22:49:04

+0

因爲Scala中的所有東西都會返回匹配項。所以你可以寫val b = subj match ...和b將包含true/false。如果那是你的意思? – 2010-09-19 00:09:58

+0

是的你是對的,比賽只能用來代替。起初我沒有那樣做。 – Grav 2010-09-19 09:22:18