简体   繁体   English

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

[英]scala code for regex pattern matching

I am new to scala. 我是scala的新手。 I am trying something on the regular expression pattern matching. 我正在尝试对正则表达式模式进行匹配。 I am following the example from here: https://alvinalexander.com/scala/how-to-extract-parts-strings-match-regular-expression-regex-scala 我正在从这里关注示例: https//alvinalexander.com/scala/how-to-extract-parts-strings-match-regular-expression-regex-scala

Given below is the code that I have written which works but is obviously not the best way. 下面给出的是我编写的有效代码,但这显然不是最佳方法。
Scenario: I have a regex pattern with me. 场景:我有一个正则表达式模式。

"([a-z0-9]+)_([0-9]+)_([v|V][0-9]+)_(\\\\d{4})(\\\\d{2})(\\\\d{2}).(xls|xlsx)".r

I have a string that defines what I am expecting for a given scenario. 我有一个字符串,用于定义给定方案的期望值。
val param = "manufacturer/order/version"

Question: I don't want to pass hardcoded values in case pattern(manufacturer, order, version) but get the output in the variables manufacturer, order and version? 问题:我不想在案例模式(制造商,订单,版本)中传递硬编码的值,而是在变量制造商,订单和版本中获取输出? One way is defining all the variables initially, but that would mean changing the code every time i need to change a string. 一种方法是最初定义所有变量,但这意味着每次我需要更改字符串时都要更改代码。 Is there a way to do it dynamically or a better way of using regex in scala. 有没有一种方法可以动态地做到这一点,还是有一种更好的在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)
  }
}


Output of the code: 代码输出:

File Name: man1_18356_v1_20180202.xls 档案名称:man1_18356_v1_20180202.xls
manufacturer, version, order 制造商,版本,订单
Manufacturer: man1, Order: 18356, version: v1 制造商:man1,订购:18356,版本:v1
key: manufacturer, value: man1 键:制造商,值:man1
key: order, value: 18356 键:订单,值:18356
key: version, value: v1 键:版本,值:v1
Target path: /man1/18356/v1 目标路径:/ man1 / 18356 / v1

Thanks! 谢谢!

This is how you can collect all groups and process them yourself: 这样可以收集所有组并自己处理它们:

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM