包含最多指定字符的Scala字符串

时间:2014-05-08 15:50:12

标签: string scala

对于一组字符,例如

val specs = "[a-c,1-3]".r

如何确定给定字符串是否包含任意数量的此类字符且仅包含此类字符,例如

isValid("a1b", specs)
true

isValid("aaa", specs)
true

isValid("1z", specs)
false

isValid("z", specs)
false

3 个答案:

答案 0 :(得分:2)

Scala中的字符串被隐式转换为StringOps,这使得集合样式方法可用,例如forall,这使得这很简单。

scala> val specs = List('a','b','c','1','2','3')
specs: List[Char] = List(a, b, c, 1, 2, 3)

scala> "a1b".forall(specs.contains(_))
res4: Boolean = true

scala> "aaa".forall(specs.contains(_))
res5: Boolean = true

scala> "1z".forall(specs.contains(_))
res6: Boolean = false

答案 1 :(得分:2)

String有一个已经采用正则表达式的方法matches

val isValid = string matches "[a-c1-3]+"

注意,必须删除,中的[a-c,1-3],因为它不是正则表达式范围检查的一部分。

答案 2 :(得分:1)

你需要逐个字母地查看字符串,看看是否有一个与正则表达式不匹配的字符串:

  import scala.util.matching._
  val specs = "[a-c,1-3]".r                       //> specs  : scala.util.matching.Regex = [a-c,1-3]

  def isValid(in:String, specs : Regex) = {
    !in.exists( c => specs.findFirstIn(c.toString).isEmpty)
  }                                               //> isValid: (in: String, specs: scala.util.matching.Regex)Boolean

  isValid("a1b",specs)                            //> res16: Boolean = true
  isValid("aaa",specs)                            //> res17: Boolean = true
  isValid("1z",specs)                             //> res18: Boolean = false
  isValid("z",specs)                              //> res19: Boolean = false

编辑结合@ Brian关于我的forall的更好答案,适用于正则表达式:

  def isValid(in:String, specs : Regex) = {
    //!in.exists( c => specs.findFirstIn(c.toString).isEmpty)
    in.forall(c => specs.findFirstIn(c.toString).isDefined)
  }