如何在符号中检查字符串是否在Scala中以功能方式列入白名单?

时间:2012-04-19 22:49:28

标签: string scala

我需要保证字符串只包含允许的符号。现在我这样做:

def isCorrect(s: String, allowedChars: String): Boolean = {
  s.distinct.foreach(c => {
    if (!allowedChars.contains(c))
      return false
  })

  true
}

毋庸置疑,这看起来并不太漂亮。是否有更好,更实用的方法来做到这一点?

4 个答案:

答案 0 :(得分:19)

对于记录,你可以通过不限制自己的字符串来使这更加通用,并且通过切换参数的顺序和使用两个参数列表来更加功能(在我看来)。这是我写的方式:

def isCorrect[A](allowed: Set[A])(s: Seq[A]) = s forall allowed

现在,您可以将此方法视为一个函数,并“部分应用”它以创建更专业的函数:

val isDigits = isCorrect("0123456789".toSet) _
val isAs = isCorrect(Set('A')) _

允许您执行以下操作:

scala> isDigits("218903")
res1: Boolean = true

scala> isAs("218903")
res2: Boolean = false

scala> isDigits("AAAAAAA")
res3: Boolean = false

scala> isAs("AAAAAAA")
res4: Boolean = true

或者您仍然可以使用类似isCorrect("abcdr".toSet)("abracadabra")的内容。

答案 1 :(得分:4)

def isCorrect(s:String, allowedChars:String):Boolean = { 
        s.forall{allowedChars.contains(_)}
    }

或者,甚至更简洁地遵循@ ziggystar的建议:

def isCorrect(s: String, allowedChars: Seq[Char]) = s forall allowedChars.contains

答案 2 :(得分:2)

我不知道这是否是最实用的方法,但你可以这样做:

def isCorrect(s: String, allowedChars: String): Boolean = {
    return s.distinct.forall(c => allowedChars.contains(c))
}

不同并非真的有必要。

答案 3 :(得分:2)

这不是更多功能,但使用正则表达式:

def isCorrect(s: String, allowedChars: String): Boolean =
  s.matches ("^["+ allowedChars +"]*$")

由于正则表达式经常被优化,我会在性能关键代码中考虑这种方法 - 不是没有测试,测量,也可能是预编译模式 - 如果适合于手头的问题。

由于功能更多,我看到Travis代码。