簡體   English   中英

用於正則表達式模式匹配的scala代碼

[英]scala code for regex pattern matching

我是scala的新手。 我正在嘗試對正則表達式模式進行匹配。 我正在從這里關注示例: https//alvinalexander.com/scala/how-to-extract-parts-strings-match-regular-expression-regex-scala

下面給出的是我編寫的有效代碼,但這顯然不是最佳方法。
場景:我有一個正則表達式模式。

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

我有一個字符串,用於定義給定方案的期望值。
val param = "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)
  }
}


代碼輸出:

檔案名稱:man1_18356_v1_20180202.xls
制造商,版本,訂單
制造商:man1,訂購:18356,版本:v1
鍵:制造商,值:man1
鍵:訂單,值:18356
鍵:版本,值:v1
目標路徑:/ man1 / 18356 / v1

謝謝!

這樣可以收集所有組並自己處理它們:

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