scala - вернуть различное значение для понимания соответствия шаблонам - PullRequest
1 голос
/ 22 апреля 2020

Я сопоставляю и заменяю 3 шаблона для понимания. Шаблоны упорядочены, и я ожидаю, что для понимания получим ans1 или ans2 или ans3, если произойдет замена, и продолжу итерацию. Я не хочу выполнять ans2 и ans3, если произойдет замена для ans1

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 с условием if (), я получаю ошибку.

if( ans1 == str2 ) {
                ans2 =   pat2.replaceAllIn(ans1, m => {
                     "".concat(m.group(1))
                   })
                 }

говорит, что не может разрешить символ ans2. Есть ли простой способ решить эту проблему?.

Добавление примеров данных для file_list, на самом деле это происходит из файла.

# 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

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Я думаю, что это то, что вы хотите, но это немного сложно сказать без тестовых данных.

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
}
1 голос
/ 23 апреля 2020
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)
  }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...