这是我的示例代码。
object Patterns {
val workingPattern = """^thisworks[\w]+""".r
val problemPattern = """^(fail|error|bs|meh)[\w]+""".r
}
object TestMaker {
var works = scala.collection.mutable.Set[String]()
var needsWork = scala.collection.mutable.Set[String]()
var junk = scala.collection.mutable.Set[String]()
def add(someInput: String) = someInput match {
case Patterns.workingPattern() => works.update(someInput, true)
case Patterns.problemPattern() => needsWork.update(someInput, true)
case _ => junk.update(someInput, true)
}
}
当我调用TestMaker.add("thisworks1234")
时,字符串“thisworks1234”会插入到TestMaker的工作集中。它按预期工作。
当我调用TestMaker.add("this_is_just_junk")
时,字符串“this_is_just_junk”会被插入到垃圾集中 - 也正如预期的那样。
这是问题所在。当我调用TestMaker.add("fail1234")
时,该字符串也将被插入到垃圾集中。但是它应该插入到needsWork集中。
我的错误在哪里?
答案 0 :(得分:1)
您应该使用非捕获组和第二个正则表达式:
val problemPattern = """^(?:fail|error|bs|meh)[\w]+""".r
^^^
这是必需的,因为您没有在case
中引用捕获的值。
请注意,您仍然可以在模式中使用捕获组,以便在match
_*
之后忽略它们:
case Patterns.workingPattern(_*) => works.update(someInput, true)
case Patterns.problemPattern(_*) => needsWork.update(someInput, true)
case _ => junk.update(someInput, true)
请参阅IDEONE demo:
object Main extends App {
TestMaker.add("this_is_just_junk")
TestMaker.add("fail1234")
println(TestMaker.needsWork) // => Set(fail1234)
println(TestMaker.junk) // => Set(this_is_just_junk)
}
object Patterns {
val workingPattern = """^thisworks[\w]+""".r
val problemPattern = """^(fail|error|bs|meh)[\w]+""".r
}
object TestMaker {
var works = scala.collection.mutable.Set[String]()
var needsWork = scala.collection.mutable.Set[String]()
var junk = scala.collection.mutable.Set[String]()
def add(someInput: String) = someInput match {
case Patterns.workingPattern(_*) => works.update(someInput, true)
case Patterns.problemPattern(_*) => needsWork.update(someInput, true)
case _ => junk.update(someInput, true)
}
}