Algorithm 基于算法的大小写匹配字符串。我应该使用哪种算法?

Algorithm 基于算法的大小写匹配字符串。我应该使用哪种算法?,algorithm,scala,pattern-matching,string-matching,Algorithm,Scala,Pattern Matching,String Matching,我需要在代码中将电视收视率(电视节目)转换为该收视率的case对象。因此,我有这样一个案例匹配: def fromString(s: String): Option[TvRating] = s.toLowerCase match { case "tvy" | "tv-y" | "tv y" | "y" => Some(tvY) case "tvg" | "tv-g" | "tv g" | "g" => Some(tvG) case "tvpg" | "tv-pg" | "

我需要在代码中将电视收视率(电视节目)转换为该收视率的case对象。因此,我有这样一个案例匹配:

def fromString(s: String): Option[TvRating] = s.toLowerCase match {
  case "tvy" | "tv-y" | "tv y" | "y" => Some(tvY)
  case "tvg" | "tv-g" | "tv g" | "g" => Some(tvG)
  case "tvpg" | "tv-pg" | "tv pg" | "pg" => Some(tvG)
  case "tv14" | "tv-14" | "tv 14" | "14" => Some(tv14)
  case "tvma" | "tv-ma" | "tv ma" | "ma" => Some(tvMA)
  case _ => Some(noTvRating)
}
正如你所看到的,我正在尝试匹配每个收视率的所有排列,这是很麻烦的,仍然没有考虑到像“tv.14”或“成熟观众”这样的东西

有没有像soundX这样的算法,但对于像这些评级这样的代码,我可以作为最后手段使用。然后我的代码将如下所示:

def fromString(s: String): Option[TvRating] = s.toLowerCase match {
  case "tvy" | "tv-y" | fancyAlgo(s, "tv-y") => Some(tvY)
  case "tvg" | "tv-g" | fancyAlgo(s, "tv-g") => Some(tvG)
  case "tvpg" | "tv-pg" | fancyAlgo(s, "tv-pg") => Some(tvG)
  case "tv14" | "tv-14" | fancyAlgo(s, "tv-14") => Some(tv14)
  case "tvma" | "tv-ma" | fancyAlgo(s, "tv-ma") => Some(tvMA)
  case _ => Some(noTvRating)
}
或者任何其他建议,我可以使这些匹配更加健壮。因为tv-g不是一个像“狗”或“马”这样的词,所以我不能基于音频或类似的发音词

这是评级的一个例子。还有其他比赛。下面是另一个明星评级的例子(比如《烂番茄》的电影评级)

干杯

Go数据驱动:

val ratings = scala.collection.mutable.Map[String, String]() withDefaultValue "noTVRating"

type TvRating = String

def addRatingStyle(base:String, result:String) = {
  val suffix = base.stripPrefix("tv")
  ratings += ("tv"+suffix->result)
  ratings += ("tv-"+suffix->result)
  ratings += ("tv "+suffix->result)
  ratings += (suffix->result)
}

addRatingStyle("tvy", "tvy")
addRatingStyle("tvg", "tvg")
addRatingStyle("tvpg", "tvpg")
addRatingStyle("tv14", "tv14")
addRatingStyle("tvma", "tvma")


def fromString(s: String): Option[TvRating] = Some(ratings(s.toLowerCase)) 
Go数据驱动:

val ratings = scala.collection.mutable.Map[String, String]() withDefaultValue "noTVRating"

type TvRating = String

def addRatingStyle(base:String, result:String) = {
  val suffix = base.stripPrefix("tv")
  ratings += ("tv"+suffix->result)
  ratings += ("tv-"+suffix->result)
  ratings += ("tv "+suffix->result)
  ratings += (suffix->result)
}

addRatingStyle("tvy", "tvy")
addRatingStyle("tvg", "tvg")
addRatingStyle("tvpg", "tvpg")
addRatingStyle("tv14", "tv14")
addRatingStyle("tvma", "tvma")


def fromString(s: String): Option[TvRating] = Some(ratings(s.toLowerCase)) 

使用
case对象
s,使用
unapply
方法定义您的个人评级。一个简单的正则表达式可能会处理其余的问题:

sealed trait TVRating

case object Youth extends TVRating {
  def unapply(s: String): Option[TVRating] = {
    //insert fancier match logic here...
    if( s.matches("tv.*y") || s.equals("y")) {
      Some(Youth)
    } else {
      None
    }
  }
}

case object General extends TVRating {
  def unapply(s: String): Option[TVRating] = {
    //insert fancier match logic here...
    if( s.matches("tv.*g")) {
      Some(Youth)
    } else {
      None
    }
  }
}

object Main extends App {

  override def main(args: Array[String]) = {
    "tv.y" match {
        case Youth(s) => println("Youth")
        case General(s) => println("General")
        case _ => println("Unknown")
    }
  }
}

使用
case对象
s,使用
unapply
方法定义您的个人评级。一个简单的正则表达式可能会处理其余的问题:

sealed trait TVRating

case object Youth extends TVRating {
  def unapply(s: String): Option[TVRating] = {
    //insert fancier match logic here...
    if( s.matches("tv.*y") || s.equals("y")) {
      Some(Youth)
    } else {
      None
    }
  }
}

case object General extends TVRating {
  def unapply(s: String): Option[TVRating] = {
    //insert fancier match logic here...
    if( s.matches("tv.*g")) {
      Some(Youth)
    } else {
      None
    }
  }
}

object Main extends App {

  override def main(args: Array[String]) = {
    "tv.y" match {
        case Youth(s) => println("Youth")
        case General(s) => println("General")
        case _ => println("Unknown")
    }
  }
}

因为这是一个有趣的解决方案,但并没有解决我的匹配问题。问题是我不知道前缀是否总是“,”或“。否则,我的原始匹配就可以在不为程序员添加上述上下文重载的情况下工作。虽然很有创意,但它并没有使用算法来找到“最佳”匹配。因为这是一个有趣的解决方案,但并没有解决我的匹配问题。问题是我不知道前缀是否总是“,”或“。否则,我的原始匹配就可以在不为程序员添加上述上下文重载的情况下工作。虽然很有创意,但它没有使用算法来找到“最佳”匹配。模糊字符串是否与我所寻找的匹配?我明白你的意思,但我认为(通常)你要求的是几乎不可能的匹配——匹配任何表示“pg”的内容,但不说明表示“pg”的内容的规则。它不是模糊的字符串匹配,因为它不清楚要匹配什么,如果你能给出更多关于什么可以匹配的细节,比如说“tv-14”(例如,应该是“14”匹配吗?),那么也许可以做点什么。
选项[]
类型的要点是它可能是
None
。为什么您的示例没有一个
None
条件?好问题,我将检查这个返回值是否在某个地方结束。或者,如果任何其他地方的这种风格的代码都没有使用过。有些可能是,为了保持一致性(例如,当将它们放入列表中进行映射时),最好在此处使用选项。模糊字符串是否与我要查找的内容匹配?我明白你的意思,但我认为(通常)你要求的是几乎不可能的匹配—匹配任何表示“pg”的内容,但不说明其含义的规则“pg”。这不是模糊的字符串匹配,因为它不清楚匹配什么,如果你能给出更多关于什么可以匹配的细节,比如说“tv-14”(例如,“14”应该匹配吗?),那么也许可以做一些事情。
选项[]的整个要点
类型是它可能是
None
。为什么您的示例没有
None
条件?好问题,我将检查此返回值是否在某个地方结束。或者其他任何地方的这种类型的代码是否使用None。为了一致性(例如,在将它们放入列表以映射时),有些可能会使用None最好选择这里的选项。我总是忘记unapply。这是一个很酷的解决方案!我看到的唯一缺点是正则表达式不在一个地方,我无法看到或添加到它们。问题:在
def main
前面的覆盖做了什么?这个答案说明了为什么我在上面评论说OP正在寻找一些东西最不可能的是(虽然答案本身没有问题)。请注意,General也与PG匹配。Soundex工作的原因是从单词的拼写到声音有一个相当容易理解的映射,尽管语音是如此(尽管由于常见的奇怪英语问题,仍然会有许多错误的肯定和否定)。人们倾向于使用Soundex进行“足够好”的匹配,而不是“必须准确地排序到正确的桶中”“这就是这里需要的。我总是忘了。这是一个很酷的解决方案!我看到的唯一不好的一面是,正则表达式并没有集中在一个地方供我查看或添加。问题:在
def main
前面,覆盖在做什么?这个答案说明了为什么我在上面评论OP正在寻找一些几乎不可能的东西(尽管答案本身不是问题)。注意,General也与PG匹配。Soundex工作的原因是,从单词的拼写到声音有一个相当容易理解的映射,尽管语音(尽管即使是这样,由于常见的奇怪的英语问题,也会有许多错误的肯定和否定)。人们倾向于使用Soundex进行“足够好”的匹配,而不是“必须准确地排序到正确的桶中”,这正是这里所需要的。