regex - Scala:将字符串与正则表达式列表进行匹配

标签 regex list scala match

我有一个字符串,比如 var str = "hello, world" 和一个 List Regex 模式

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(...), ...).

最佳答案

试试这个:

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))

我怀疑这可能会被玩弄和整理,但应该给出总体思路。

关于regex - Scala:将字符串与正则表达式列表进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18466929/

相关文章:

javascript - 如何克服JavaScript代码中缺少Perl的\G?

regex - 使用 powershell 捕获数组中的正则表达式匹配

javascript - CSS 正则表达式 {height :100%}

regex - 如何使用 findstr 提取子字符串

scala - 在 Scala concurrent.Map 中混合的最佳实践

xml - 我可以使用 Scala 的内置 xml 处理程序忽略无效的 XML 字符吗?

python - 使用列表理解替换字符串

python - 将列表转换为 ListNode

list - 根据每个列表的第三个元素对 flutter 中的 2D 列表进行排序

list - 如何在 Scala 中合并和区分列表?