对于一组字符,例如
val specs = "[a-c,1-3]".r
如何确定给定字符串是否包含任意数量的此类字符且仅包含此类字符,例如
isValid("a1b", specs)
true
isValid("aaa", specs)
true
isValid("1z", specs)
false
isValid("z", specs)
false
答案 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)
}