用于正则表达式模式匹配的 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"
问题:我不想在 case pattern(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)
}
}
代码输出:
文件名: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
}
我是 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"
问题:我不想在 case pattern(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)
}
}
代码输出:
文件名: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
}