Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala正则表达式模式匹配是否正常工作?_Scala - Fatal编程技术网

Scala正则表达式模式匹配是否正常工作?

Scala正则表达式模式匹配是否正常工作?,scala,Scala,我是Scala新手,但有人告诉我,“您正在检查下面的代码片段@是否为“Toronto Raptor”==matchNY。”,我真的不知道为什么“Toton Raptor”是for循环中唯一选择与正则表达式匹配的字符串,有人能给我解释一下吗? 谢谢 大卫 val matchNY=“^.*New.*$”.r val团队=列表( “多伦多猛禽”, “纽约网”, “旧金山49人”, “达拉斯小牛队” ) 对于(团队println(“去纽约”) 案例=>println(“Boo”) } } 注1:此处解

我是Scala新手,但有人告诉我,“您正在检查下面的代码片段@是否为“Toronto Raptor”==matchNY。”,我真的不知道为什么“Toton Raptor”是for循环中唯一选择与正则表达式匹配的字符串,有人能给我解释一下吗?
谢谢 大卫

val matchNY=“^.*New.*$”.r
val团队=列表(
“多伦多猛禽”,
“纽约网”,
“旧金山49人”,
“达拉斯小牛队”
)
对于(团队println(“去纽约”)
案例=>println(“Boo”)
}
}

注1:此处解释了反勾号的用法@

在for循环中,您实际上是在检查
团队
列表中的每个项目是否等于regex
matchNY
,并且列表中的每个项目都被检查,而不仅仅是“Toronto Raptor”。这相当于for循环:

  for (team <- teams) {
    if (team == matchNY) println("Go New York.")
    else println("Boo")
  }
我想你要找的是,是否有符合你的正则表达式的东西。你可以这样做:

  for (team <- teams) {
    matchNY.findFirstMatchIn(team) match {
      case Some(teamMatch) => {
        println("Go New York.")
        println(teamMatch)
      }
      case _ => {
        println("Boo")
        println(team)
      }
    }
  }

是的,它工作正常。模式匹配背后的魔力叫做

如果您深入研究的ScalaDoc,您将看到它只定义了
unplyseq
,而不是
unplyseq

这意味着,如果希望在模式匹配时使用正则表达式,则应执行以下操作(注意matchNY后面的括号):

val matchNY=“^.*New.*$”.r
val团队=列表(
“多伦多猛禽”,
“纽约网”,
“旧金山49人”,
“达拉斯小牛队”
)
对于(团队println(“去纽约”)
案例=>println(“Boo”)
}
}

否则,您只需检查列表中的元素是否为
==matchNY
,这不是您想要的

val matchNY = "^.*New.*$".r
而不是
^.New.$
,如果您希望匹配包含
New
的字符串

在Scala中,
case
语句块可以看作是一个序列 关于部分函数

以你为例,

case `matchNY` => // ...
翻译为:

case x if x == matchNY  => // .. 
因此,这将尝试将
字符串
多伦多猛禽“
Regexp
对象
^.*新。*$
使用平等:

这不匹配,因为
字符串
Regexp
对象是两个不同的东西

列表中的任何其他
字符串
也是如此:

"New York Nets" !=  ("^.*New.*$".r)
也不匹配。在case语句中使用regexp作为匹配项的方法是:

case matchNY() => // .... Note the ()
这在引擎盖下(大致)相当于

case x matchNY.unapplySeq(x).isDefined =>  // ...
case语句中的regexp的实现方式与 一种
unplyseq
方法。最后一个表达式显示前一个表达式的内容 翻译成

如果matchNY有以下捕获:

val matchNY = "^.*New York\s(.*)$".r
然后您可以使用它来提取捕获的匹配:

case matchNY(something) => // 'something' is a String variable 
                           // with value "Nets"
旁注

你的例子可以浓缩为

teams foreach { 
   case matchNY() => println("Go New York.")
   case _ => println("Boo")
}

请始终记住,Scala的
Regex
匹配中使用时是锚定的。因此您使用的
^
$
是冗余的。为什么需要指示模式的参数,即
case matchNY(41;
而不是
case matchNY()
?为什么我需要在模式中指示括号,即
val matchNY=“(纽约网络)”.r
而不是
val matchNY=“纽约网络”.r
case matchNY() => // .... Note the ()
case x matchNY.unapplySeq(x).isDefined =>  // ...
val matchNY = "^.*New York\s(.*)$".r
case matchNY(something) => // 'something' is a String variable 
                           // with value "Nets"
teams foreach { 
   case matchNY() => println("Go New York.")
   case _ => println("Boo")
}