如何在scala中对命令行参数进行不区分大小写的匹配?

如何在scala中对命令行参数进行不区分大小写的匹配?,scala,command-line-interface,scopt,Scala,Command Line Interface,Scopt,我正在开发一个用Scala编写的命令行工具,其执行方式如下: sbt "run --customerAccount 1234567" 现在,我想让它灵活地接受-CUSTOMERACCOUNT或-CUSTOMERACCOUNT或-CUSTOMERACCOUNT…你明白了吗 下面是代码的样子: lazy val OptionsParser: OptionParser[Args] = new scopt.OptionParser[Args]("scopt")

我正在开发一个用Scala编写的命令行工具,其执行方式如下:

sbt "run --customerAccount 1234567"
现在,我想让它灵活地接受-CUSTOMERACCOUNT或-CUSTOMERACCOUNT或-CUSTOMERACCOUNT…你明白了吗

下面是代码的样子:

lazy val OptionsParser: OptionParser[Args] = new scopt.OptionParser[Args]("scopt") {
    head(
      "XML Generator",
      "Creates XML for testing"
    )
    help("help").text(s"Prints this usage message. $envUsage")

    opt[String]('c', "customerAccount")
      .text("Required: Please provide customer account number as -c 12334 or --customerAccount 12334")
      .required()
      .action { (cust, args) =>
        assert(cust.nonEmpty, "cust is REQUIRED!!")
        args.copy(cust = cust)
      }
}
我假设opt[String]'c',customerAccount从命令行进行模式匹配,并将与customerAccount匹配-如何使其与-customerAccount或-customerAccount或-customerAccount匹配?args.copy cust=cust具体做什么


如果问题看起来太简单,我道歉。我对Scala非常陌生,之前曾在Java和Python中工作过,因此有时我发现语法也有点难以理解。

您通常会使用以下代码解析参数:

OptionsParser.parse(args, Args())
因此,如果您希望不区分大小写,可能最简单的方法是使用以下内容规范化args的大小写

val canonicalized = args.map(_.toLowerCase)

OptionsParser.parse(canonicalized, Args())
或者,例如,如果您只想规范化以裸字符开头和之前的参数:

关于第二个问题,由于Args几乎可以肯定是一个case类,因此它有一个copy方法,根据其字段的不同值的使用情况,该方法很可能构造一个新对象。所以

 args.copy(cust = cust)
创建新的Args对象,其中:

该对象中cust字段的值就是该块中cust变量的值这基本上是一个使用命名方法参数的有点聪明的技巧 其他每个字段的值都取自args
您通常会使用以下代码解析args:

OptionsParser.parse(args, Args())
因此,如果您希望不区分大小写,可能最简单的方法是使用以下内容规范化args的大小写

val canonicalized = args.map(_.toLowerCase)

OptionsParser.parse(canonicalized, Args())
或者,例如,如果您只想规范化以裸字符开头和之前的参数:

关于第二个问题,由于Args几乎可以肯定是一个case类,因此它有一个copy方法,根据其字段的不同值的使用情况,该方法很可能构造一个新对象。所以

 args.copy(cust = cust)
创建新的Args对象,其中:

该对象中cust字段的值就是该块中cust变量的值这基本上是一个使用命名方法参数的有点聪明的技巧 其他每个字段的值都取自args
您的问题似乎与scopt库相关,而不是与scala相关。一般来说,我会从scopt文档开始,看看它是否支持您需要的内容。您的问题似乎与scopt库相关,而不是与scala相关。一般来说,我会从scopt文档开始,看看它是否支持您需要的内容。这非常有帮助,谢谢你,好心的先生!我对cust=cust感到困惑,因为它们乍一看都是相同的。由于有java背景,为了更好的可读性,我更喜欢this.cust=cust。我想我会将args的情况进行分类,看看它是如何建立起来的!非常感谢你的回答这是非常有帮助的,谢谢好心的先生!我对cust=cust感到困惑,因为它们乍一看都是相同的。由于有java背景,为了更好的可读性,我更喜欢this.cust=cust。我想我会将args的情况进行分类,看看它是如何建立起来的!非常感谢你的回答