Scala-код для сопоставления с регулярным выражением - PullRequest
0 голосов
/ 01 мая 2018

Я новичок в скале. Я пытаюсь что-то на соответствие шаблону регулярного выражения. Я следую примеру отсюда: 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

Спасибо!

1 Ответ

0 голосов
/ 01 мая 2018

Вот как вы можете собрать все группы и обработать их самостоятельно:

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
}
...