scala 字符串不区分大小写的模式匹配

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23115023/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-22 06:11:32  来源:igfitidea点击:

Case insensitive pattern matching for strings

scala

提问by ZhekaKozlov

match (str) {
  case "String1" => ???
  case "String2" => ???
}

This is case sensitive matching. How to write case insensitive matching? I know I can call toLowerCase for each branch, but I want more elegant solution.

这是区分大小写的匹配。如何编写不区分大小写的匹配?我知道我可以为每个分支调用 toLowerCase,但我想要更优雅的解决方案。

回答by Andreas Neumann

Basic approach:

基本方法:

You could use Pattern Guardsand Regular Expressions

您可以使用模式保护正则表达式

str match {
case s if s matches "(?i)String1" => 1
case s if s matches "(?i)String2" => 2
case _ => 0
}

Sophisticated method:

精妙的方法:

Implicitswith String Interpolationand Regex

Implicits字符串插值正则表达式

implicit class CaseInsensitiveRegex(sc: StringContext) {
  def ci = ( "(?i)" + sc.parts.mkString ).r
}

def doStringMatch(str: String) = str match {
  case ci"String1" => 1
  case ci"String2" => 2
  case _ => 0
}

Some example usage in the REPL:

REPL 中的一些示例用法:

scala> doStringMatch("StRINg1")
res5: Int = 1

scala> doStringMatch("sTring2")
res8: Int = 2

回答by pathikrit

Another approach that does not depend on regexes or interpolaters:

另一种不依赖于正则表达式或插值器的方法:

 implicit class StringExtensions(val s: String) extends AnyVal {
    def insensitive = new {
      def unapply(other: String) = s.equalsIgnoreCase(other)
    }
  }

  val test1 = "Bye".insensitive
  val test2 = "HELLo".insensitive

  "Hello" match {
    case test1() => println("bad!")
    case test2() => println("sweet!")
    case _ => println("fail!")
  }

Here is another way using interpolaters but no regex:

这是使用插值器但没有正则表达式的另一种方法:

  implicit class StringInterpolations(sc: StringContext) {
    def ci = new {
      def unapply(other: String) = sc.parts.mkString.equalsIgnoreCase(other)
    }
  }

  "Hello" match {
    case ci"Bye" => println("bad!")
    case ci"HELLO" => println("sweet!")
    case _ => println("fail!")
  }

The above can also be used to pattern match inside case classes e.g.:

以上也可用于在 case 类中进行模式匹配,例如:

case class Dog(name: String)

val fido = Dog("FIDO")

fido match {
  case Dog(ci"fido") => "woof"    
  case _ => "meow :("    
}

回答by Antonio Maria Sanchez Berrocal

Easy solution:

简单的解决方案:

val str = "string1"

str toUpperCase match (str) {
  case "STRING1" => ???
  case "STRING2" => ???
}