使用|时Scala Regex模式匹配问题

时间:2016-04-20 23:56:39

标签: regex scala

这是我的示例代码。

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集中。

我的错误在哪里?

1 个答案:

答案 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)    
  }
}