簡體   English   中英

Scala:將String與Regex列表進行匹配

[英]Scala: matching a String against a List of Regex

我有一個字符串,比如var str = "hello, world"和一個正則Regex List

val patterns = List(new Regex("hello, (.*)", "substr"), new Regex("hi, (.*)", "substr"))

我怎樣才能將str與這些模式相匹配? 現在,我沒有使用模式List ,而是執行以下操作:

val pattern1 = new Regex("hello, (.*)", "substr")
val pattern2 = new Regex("hi, (.*)", "substr")
var someVar = "something"
var someVar2 = "something else"
str match {
    case pattern1(substr) => { someVar = substr; someVar2 = "someValue" }
    case pattern2(substr) => { someVar = substr; someVar2 = "someOtherValue" }

}

附錄:

我忘了提一件重要的事情:實際上有幾個模式列表。 並且someVar2取決於發生第一個模式匹配的列表而取其值。 對我來說,使用嵌套列表如List(List(new Regex(...), new Regex(...), ...), List(new Regex(...), new Regex(...), ...))或為每個模式列表使用單獨的val ,如val patterns1 = List(new Regex(...), ...); val patterns2 = List(new Regex(...), ...) val patterns1 = List(new Regex(...), ...); val patterns2 = List(new Regex(...), ...)

嘗試這個:

scala> patterns.collectFirst{ p => str match { case p(substr) => substr } }
res3: Option[String] = Some(world)

scala> val str2 = "hi, Fred"
str2: String = hi, Fred

scala> patterns.collectFirst{ p => str2 match { case p(substr) => substr } }
res4: Option[String] = Some(Fred)

編輯:更新以考慮更改的要求...

鑒於:

val patternMapping = Map(("marker1" -> patterns), ("marker2" -> patterns2), ...)

你應該能夠嵌套collectFirst調用,結果是這樣的:

scala> patternMapping.collectFirst{ case (mark, pList) => pList.collectFirst{ p => str match { case p(substr) => (mark -> substr) } } }.flatten
res5: Option[(String, String)] = Some((marker1,world))

我懷疑這可能會被玩弄和整理,但應該給出一般的想法。

那么你自己解決了它。 有很多方法。 其中一種慣用方法是:

 val patterns = List(new Regex("hello, (.*)", "substr"), new Regex("hi, (.*)", "substr"))
 patterns.foreach{ x =>
   str match { 
          case x(substr) => { someVar = substr; someVar2 = "defaultValue" }
          case _ => ;     
       }
 }

如果您希望將defaultValue替換為匹配的正則表達式索引,則:

val  i = patterns.zipWithIndex
i.foreach{ x =>
       str match { 
              case x._1(substr) => { someVar = substr; someVar2 = "defaultValue - "+x._2 }
              case _ => ;     
           }
     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM