Scala:regex直接在模式匹配块中

Scala:regex直接在模式匹配块中,regex,scala,pattern-matching,Regex,Scala,Pattern Matching,我有以下带有模式匹配的正则表达式: val url = "/en/about" val langRegex = "/(.{2}).*".r val lang = url match { case langRegex(lang) => lang case _ => "en" } 但我想实现这样的功能(我不想为regex创建额外的变量,而是直接将其放入匹配块中) 我在第二种情况下遇到编译器错误?我刚刚用〈strong〉“/(.{2}.*.”替换了〈strong〉langReg

我有以下带有模式匹配的正则表达式:

val url = "/en/about"
val langRegex = "/(.{2}).*".r

val lang = url match {
  case langRegex(lang) => lang
  case _ => "en"
}
但我想实现这样的功能(我不想为regex创建额外的变量,而是直接将其放入匹配块中)

我在第二种情况下遇到编译器错误?我刚刚用〈strong〉“/(.{2}.*.”替换了〈strong〉langRegex(lang),这些表达式应该相等,不是吗


为什么这是一个错误?

这不起作用,因为您只能匹配中定义的值。 在第一个示例中,您的匹配形式为
StableId'(“[Patterns]”)
,其中
StableId
是一个
或一个
对象
,但不是一个可以随时更改的
def

您的第二个示例不起作用,因为
“/(.{2})。*”.r
不是一个StableId。第二个示例不起作用,因为以下示例也不起作用:

val url = "/en/about"
def langRegex = "/(.{2}).*".r

val lang = url match {
  case langRegex(lang) => lang
  case _ => "en"
}

我将您的
langRegex
定义更改为
def
,因此它不再是稳定ID。

这不起作用,因为您只能匹配中定义的值。 在第一个示例中,您的匹配形式为
StableId'(“[Patterns]”)
,其中
StableId
是一个
或一个
对象
,但不是一个可以随时更改的
def

您的第二个示例不起作用,因为
“/(.{2})。*”.r
不是一个StableId。第二个示例不起作用,因为以下示例也不起作用:

val url = "/en/about"
def langRegex = "/(.{2}).*".r

val lang = url match {
  case langRegex(lang) => lang
  case _ => "en"
}

在这里,我将您的
langRegex
定义更改为
def
,因此它不再是一个稳定的ID。

问题是您无法做到这一点,您需要一个预编译的模式。您可以在内部使用
if
并在字符串与正则表达式匹配时使用一些字符串操作,或者只使用更简单的代码,如in或use。问题是您无法做到这一点,您需要一个预编译模式。您可以在内部使用
if
并在字符串与正则表达式匹配时使用一些字符串操作,或者只使用更简单的代码,如in或use。@此外,如果回答了您的问题,您还可以将其作为可接受的答案进行检查question@moreo如果它回答了您的问题,您也可以将其检查为已接受的答案