Scala正则表达式模式匹配是否正常工作?
我是Scala新手,但有人告诉我,“您正在检查下面的代码片段@是否为“Toronto Raptor”==matchNY。”,我真的不知道为什么“Toton Raptor”是for循环中唯一选择与正则表达式匹配的字符串,有人能给我解释一下吗?Scala正则表达式模式匹配是否正常工作?,scala,Scala,我是Scala新手,但有人告诉我,“您正在检查下面的代码片段@是否为“Toronto Raptor”==matchNY。”,我真的不知道为什么“Toton Raptor”是for循环中唯一选择与正则表达式匹配的字符串,有人能给我解释一下吗? 谢谢 大卫 val matchNY=“^.*New.*$”.r val团队=列表( “多伦多猛禽”, “纽约网”, “旧金山49人”, “达拉斯小牛队” ) 对于(团队println(“去纽约”) 案例=>println(“Boo”) } } 注1:此处解
谢谢 大卫
val matchNY=“^.*New.*$”.r
val团队=列表(
“多伦多猛禽”,
“纽约网”,
“旧金山49人”,
“达拉斯小牛队”
)
对于(团队println(“去纽约”)
案例=>println(“Boo”)
}
}
注1:此处解释了反勾号的用法@在for循环中,您实际上是在检查
团队
列表中的每个项目是否等于regexmatchNY
,并且列表中的每个项目都被检查,而不仅仅是“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")
}