scala-返回不同的值以理解匹配模式

scala-返回不同的值以理解匹配模式,scala,Scala,为了理解,我在a中匹配并替换了3个模式。模式是有序的,我希望 如果发生替换,则理解生成ans1或ans2或ans3,并继续迭代。 如果ans1发生替换,我不想执行ans2和ans3 val pat1 ="""(?sm)^\s*#.+?$""".r val pat2 ="""(?sm)^(.+?((['"])[^\\3]*\3))(.*)""".r val pat3 ="""(?sm)(#.+?$)""".r val ansx = for { str <- file_list s

为了理解,我在a中匹配并替换了3个模式。模式是有序的,我希望 如果发生替换,则理解生成ans1或ans2或ans3,并继续迭代。 如果ans1发生替换,我不想执行ans2和ans3

val pat1 ="""(?sm)^\s*#.+?$""".r
val pat2 ="""(?sm)^(.+?((['"])[^\\3]*\3))(.*)""".r
val pat3 ="""(?sm)(#.+?$)""".r
val ansx = for { str <- file_list

     str2 = str.toString
     ans1 = pat1.replaceAllIn(str2, "") // if replacement happens yield ans1
     ans2 = pat2.replaceAllIn(ans1, m => {
         "".concat(m.group(1))
       })  // if replacement happens yield ans2 
     ans3 = pat3.replaceAllIn(ans2, "") 
} yield ans3
它表示无法解析符号ans2。 有没有简单的方法来解决这个问题

为文件列表添加示例数据,实际上它来自一个文件

# comment1
# comment2
#hbase_table_name=mytable # hbase table.
hbase_table_name=newtable # hbase table.
hbase_txn_family=txn
app_name= "cust#100"  # Name of the application
#app_name= "cust#100"  # Name of the application
app_user= 'all#50,all2#100'  # users
hbase.zookeeper.quorum=localhost
zookeeper.znode.parent=/hbase-secure
hbase.zookeeper.property.clientPort=2181
# from comments, other lines
hbase_table_name=newtable ## hbase table.
app_user= 'all#50,all2#100'  # users - "all" of them

我想这是你想要的,但是没有测试数据就有点难说了

val pat1 ="""(?sm)^\s*#.+?$""".r
val pat2 ="""(?sm)^(.+?((['"])[^\\3]*\3)).*""".r
val pat3 ="""(?sm)#.+?$""".r.unanchored

val rslt = file_list.map{
  case s @ pat1()      => pat1.replaceAllIn(s, "")
  case s @ pat2(a,_,_) => pat2.replaceAllIn(s, a)
  case s @ pat3()      => pat3.replaceAllIn(s, "")
  case s => s
}

对这很有效。。我认为理解不适合这种类型的处理。@jwvh。。添加测试数据是。。它有效..顺便问一句,为什么理解不起作用?你的理解的
有一个生成器,

object YieldPatterns {

  def main(args: Array[String]): Unit = {
    val pat1 ="""(?sm)^\s*#.+?$"""
    val pat2 ="""(?sm)^(.+?((['"])[^\\3]*\3))(.*)"""
    val pat3 ="""(?sm)(#.+?$)"""
    val file_list = List("aaaa","1111","222")

    val output : List[String] = file_list.map(fileName => {
      var ans = fileName
      if(ans.matches(pat1)) {
        ans = pat1.r.replaceAllIn(ans,"")
      }
      if(ans.matches(pat2)) {
        ans = pat2.r.replaceAllIn(ans,m => {
          "".concat(m.group(1))
        })
      }
      if(ans.matches(pat3)) {
        ans = pat3.r.replaceAllIn(ans,"")
      }
      ans
    })
    println(output)
  }

}

val pat1 ="""(?sm)^\s*#.+?$""".r
val pat2 ="""(?sm)^(.+?((['"])[^\\3]*\3)).*""".r
val pat3 ="""(?sm)#.+?$""".r.unanchored

val rslt = file_list.map{
  case s @ pat1()      => pat1.replaceAllIn(s, "")
  case s @ pat2(a,_,_) => pat2.replaceAllIn(s, a)
  case s @ pat3()      => pat3.replaceAllIn(s, "")
  case s => s
}