scala-返回不同的值以理解匹配模式
为了理解,我在a中匹配并替换了3个模式。模式是有序的,我希望 如果发生替换,则理解生成ans1或ans2或ans3,并继续迭代。 如果ans1发生替换,我不想执行ans2和ans3scala-返回不同的值以理解匹配模式,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
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
}