Regex 用于正则表达式模式匹配的scala代码

Regex 用于正则表达式模式匹配的scala代码,regex,scala,pattern-matching,regex-group,Regex,Scala,Pattern Matching,Regex Group,我是斯卡拉的新手。我正在尝试正则表达式模式匹配。下面我举一个例子: 下面是我编写的代码,虽然有效,但显然不是最好的方法。 场景:我有一个正则表达式模式 “([a-z0-9]+)([0-9]+)([v | v][0-9]+)(d{4})(\\d{2})(\\d{2})。(xls | xlsx)”.r 我有一个字符串,它定义了我对给定场景的期望值。val param=“manufacturer/order/version” 问题:我不想在case模式(manufacturer、order、versi

我是斯卡拉的新手。我正在尝试正则表达式模式匹配。下面我举一个例子:

下面是我编写的代码,虽然有效,但显然不是最好的方法。
场景:我有一个正则表达式模式

“([a-z0-9]+)([0-9]+)([v | v][0-9]+)(d{4})(\\d{2})(\\d{2})。(xls | xlsx)”.r

我有一个字符串,它定义了我对给定场景的期望值。
val param=“manufacturer/order/version”

问题:我不想在case模式(manufacturer、order、version)中传递硬编码的值,而是在变量manufacturer、order和version中获取输出?一种方法是最初定义所有变量,但这意味着每次需要更改字符串时都要更改代码。是否有一种方法可以动态地执行此操作,或者有一种更好的方法可以在scala中使用正则表达式

package com.testing

class DynamicFolder() {

  def dynamicPath(fileName: String): Map[String, String] = { 
    println("File Name: " + fileName)

    val param = "manufacturer/order/version"

    var patternString = param.replaceAll("/", ", ")
    println(patternString)

    val pattern = "([a-z0-9]+)_([0-9]+)_([v|V][0-9]+)_(\\d{4})(\\d{2})(\\d{2}).(xls|xlsx)".r
    val paramMap: Map[String, String] = fileName match {
      case pattern(manufacturer, order, version) => {
        println(s"Manufacturer: $manufacturer, Order: $order, version: $version")
        Map("manufacturer" -> manufacturer, "order" -> order, "version" -> version)
      }

      case pattern(manufacturer, order, version, yyyy, mm, dd, format) => {
        println(s"Manufacturer: $manufacturer, Order: $order, version: $version")
        Map("manufacturer" -> manufacturer, "order" -> order, "version" -> version)
      }

      case _ => throw new IllegalArgumentException
    }  
    paramMap
  }
}

object hello {

  def main(args: Array[String]): Unit = {
    var dynamicFolder = new DynamicFolder

    val fileName = "man1_18356_v1_20180202.xls"
    val tgtParams = dynamicFolder.dynamicPath(fileName)
    var tgtPath = "" 
    for ((k, v) <- tgtParams) {
      printf("key: %s, value: %s\n", k, v)
      tgtPath = tgtPath + "/" + tgtParams(k)
    }

    println ("Target path: "+tgtPath)
  }
}
package.com.testing
类DynamicFolder(){
def dynamicPath(文件名:String):映射[String,String]={
println(“文件名:”+文件名)
val param=“制造商/订单/版本”
var patternString=param.replaceAll(“/”,“,”)
println(模式字符串)
val pattern=“([a-z0-9]+)([0-9]+)([v|v][0-9]+)([d{4})(\\d{2})(\\d{2})。(xls{xlsx)”
val paramMap:Map[String,String]=文件名匹配{
案例模式(制造商、订单、版本)=>{
println(s“制造商:$制造商,订单:$订单,版本:$版本”)
地图(“制造商”->制造商,“订单”->订单,“版本”->版本)
}
案例模式(制造商、订单、版本、yyyy、mm、dd、格式)=>{
println(s“制造商:$制造商,订单:$订单,版本:$版本”)
地图(“制造商”->制造商,“订单”->订单,“版本”->版本)
}
案例=>抛出新的IllegalArgumentException
}  
参数图
}
}
对象你好{
def main(参数:数组[字符串]):单位={
var dynamicFolder=新的dynamicFolder
val fileName=“man1_18356_v1_20180202.xls”
val tgtParams=dynamicFolder.dynamicPath(文件名)
var tgtPath=“”

对于((k,v),您可以这样收集所有组并自己处理它们:

val paramMap: Map[String, String] = fileName match {
    case pattern(groups@_*) if groups.nonEmpty => {
        // Access group with groups(0), groups(1) etc.
    }

    case _ => throw new IllegalArgumentException
}

你的意思是想在一个Seq中捕获所有组,然后使用索引进行访问吗?嗨,Dennis,是的,这一行还有更多内容。谢谢!例如,我不想传递所有硬编码的值,而是希望以运行时
案例模式(制造商、订单、版本、yyyy、mm、dd、格式)获取值
并根据每个值存储实际字符串中的值。有时,我可能只需要3个不符合顺序的值,例如:模式匹配成功后,我可能需要顺序、版本和dd。您是否只是想用类似:
case模式的内容替换变量(groups@_*)
?这将使您能够以更动态的方式访问所有值。您能提供代码片段以便我进行测试吗?谢谢!嗨,丹尼斯,谢谢您的回复。您能解释一下代码的作用吗-(groups@_*)如何通过从这里传递变量名来创建映射-val param=“manufacturer/order/version”对于每个组的值?我不想像val manufacturer=groups(0)或val order=groups(1)那样硬编码。谢谢,我能够使用scala中的数组、列表和zip函数解决这个问题