gpt4 book ai didi

regex - Scala 正则表达式(由双引号分隔的字符串)

转载 作者:行者123 更新时间:2023-12-04 11:09:11 25 4
gpt4 key购买 nike

我是 Scala 的新手。我正在尝试匹配由双引号分隔的字符串,但我对以下行为感到有些困惑:

如果我执行以下操作:

val stringRegex = """"([^"]*)"(.*$)"""
val regex = stringRegex.r
val tidyTokens = Array[String]("1", "\"test\"", "'c'", "-23.3")
tidyTokens.foreach {
token => if (token.matches (stringRegex)) println (token + " matches!")
}

我得到
"test" matches!

否则,如果我执行以下操作:
tidyTokens.foreach {
token => token match {
case regex(token) => println (token + " matches!")
case _ => println ("No match for token " + token)
}
}

我得到
No match for token 1
No match for token "test"
No match for token 'c'
No match for token -23.3

为什么在第二种情况下“测试”不匹配?

最佳答案

拿你的正则表达式:

 "([^"]*)"(.*$)

使用 .r 编译时,这个字符串产生一个 regex object - 如果它匹配它的输入字符串,它必须产生 2 捕获的字符串 - 一个用于 ([^"]*)另一个用于 (.*$) .你的代码
  case regex(token) => ...

应该反射(reflect)这一点,所以也许你想要
  case regex(token, otherStuff) => ...

要不就
  case regex(token, _) => ...

为什么?因为 case regex(matchedCaputures...)语法有效,因为 regex是一个
带有 unapplySeq 的对象方法。 case regex(token) => ...翻译(大致)为:
 case List(token) => ...

哪里 List(token)是什么 regex.unapplySeq( inputString )返回:
 regex.unapplySeq("\"test\"") // Returns Some(List("test", ""))

您的正则表达式确实与字符串 "test" 匹配但在 case声明正则表达式提取器的 unapplySeq方法返回一个列表 2 字符串,因为这是正则表达式所说的它捕获的内容。这很不幸,但编译器在这里帮不了你,因为正则表达式是在运行时从字符串编译的。

一种替代方法是使用非捕获组:
 val stringRegex = """"([^"]*)"(?:.*$)"""
// ^^

那么你的代码就可以工作了,因为 regex现在将是一个提取器对象,其 unapplySeq方法只返回一个捕获的组:
 tidyTokens foreach { 
case regex(token) => println (token + " matches!")
case t => println ("No match for token " + t)
}

看看 Extractor Objects 上的教程,为了更好地理解
怎么样 apply/ unapply/ unapplySeq作品。

关于regex - Scala 正则表达式(由双引号分隔的字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15119238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com