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

2023-12-26

我是斯卡拉新手。我正在尝试匹配由双引号分隔的字符串,并且我对以下行为有点困惑:

如果我执行以下操作:

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!")
}

I get

"test" matches!

否则,如果我执行以下操作:

tidyTokens.foreach {
    token => token match {
        case regex(token) => println (token + " matches!")
        case _ => println ("No match for token " + token)
    }
}

I get

No match for token 1
No match for token "test"
No match for token 'c'
No match for token -23.3

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


采取你的正则表达式:

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

当编译时.r,这个字符串产生一个regexobject - 如果它与输入字符串匹配,则必须产生2捕获的字符串 - 一个用于([^"]*)另一个为(.*$)。你的代码

  case regex(token) => ...

应该反映这一点,所以也许你想要

  case regex(token, otherStuff) => ...

Or just

  case regex(token, _) => ...

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

 case List(token) => ...

Where 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)
 }

看看教程提取器对象 http://www.scala-lang.org/node/112,为了更好地理解 如何apply / unapply / unapplySeq works.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 正则表达式(用双引号分隔的字符串) 的相关文章

  • Scala:折叠与折叠左

    我试图了解fold 和foldLeft 以及各自的reduce 和reduceLeft 如何工作 我使用 Fold 和 FoldLeft 作为示例 scala gt val r List ArrayBuffer 1 2 3 4 10 sca
  • RegEX 匹配方括号之外的所有内容

    我正在使用 WP 编辑器 我想创建一个 RegEX 模式来匹配方括号之外的所有内容 如下所示 foo Some selected text here foo More selected text here 并替换为 foo text box
  • jQuery:如何用反斜杠转义单引号和双引号

    我想在一行而不是两行中使用反斜杠转义单引号和双引号 单引号示例 str str replace g 有没有办法同时对包含的双引号执行此操作 嗅探器在下面很好地回答了这个问题 我最终转义了我们需要的所有字符 如下所示 str str repl
  • 在 Scala 中实现“.clone”

    我正在想办法 clone我自己的对象 在 Scala 中 这是为了模拟 因此可变状态是必须的 由此产生了克隆的全部需要 在提前模拟时间之前 我将克隆整个状态结构 这是我目前的尝试 abstract trait Cloneable A See
  • 结构化流式自定义重复数据删除

    我有一个从 kafka 进入 dataFrame 的流数据 我想根据 Id 删除重复项并根据时间戳保留最新记录 样本数据是这样的 Id Name count timestamp 1 Vikas 20 2018 09 19T10 10 10
  • 在 Scala Spark 和 PySpark 之间传递 SparkSession

    我的要求是从现有的 PySpark 程序调用 Spark Scala 函数 将 PySpark 程序中创建的 SparkSession 传递给 Scala 函数的最佳方法是什么 我将 scala jar 传递给 Pyspark 如下所示 s
  • sbt:未经授权发布到公司 Nexus 存储库

    快速解决 所需的凭证需要连接所定义的确切领域 请参阅下面如何找到您定义的那个 但最肯定的是 Sonatype Nexus Repository Manager 像平常一样将其余详细信息添加到凭据中 c data user sbt crede
  • 正则表达式替换多个组

    我想使用正则表达式将多个组替换为相应的替换字符串 更换表 gt amp gt hsh 1 gt 5 5 gt 6 例如 对于以下输入字符串 a1asda fj ahdk5adfls 对应的输出字符串是 a5asda ampfj hshahd
  • 从谷歌街道地址中提取城市和州信息

    我有一个数据集 其中包含不同点位置的纬度 经度信息 我想知道与每个点关联的城市和州 按照此example https stackoverflow com questions 22911642 applying revgeocode to a
  • 替换文本区域的文字

    我制作了一个 javascript 函数来将文本区域中的某些单词替换为其他单词 但它不起作用 我做了这个 function wordCheck var text document getElementById eC value var ne
  • 在 C# 中查找字符串中指定字符串的所有索引

    您好 我正在尝试使用以下解决方案 在 C 中查找字符串中的所有模式索引 https stackoverflow com questions 10546302 find all pattern indexes in string in c s
  • 在 PowerShell 中按列拆分文本

    我是一个 PowerShell 新手 通常是 Bash 目前正在尝试获取 qwinsta 输出以显示谁以 rdpwd rdesktop 用户身份登录 以便我可以根据用户名列表检查每个用户名 如果它们不匹配 请将其注销 我目前正在解决两个问题
  • 将高度嵌套的列从字符串更新为结构

    x array nullable true element struct containsNull true y long nullable true z array nullable true element struct contain
  • Scala/Lift 的 OAuth 2.0 提供程序实现

    有谁知道 Scala Lift 的 OAuth 2 0 提供程序 服务器端 实现吗 我看到 Scala 2 0 客户端 但没有提供程序 看起来并不存在现成可用的 所以我认为你有两个选择 自己实施一个 Use a Java库 http cod
  • 我什么时候应该使用 Scala 的数组而不是其他集合之一?

    这更多的是风格和偏好的问题 但这里是 我什么时候应该使用 scala Array 我一直使用 List 偶尔会遇到 Seq Map 等 但我从未在野外使用或见过 Array 仅仅是为了兼容 Java 吗 我错过了一个常见的用例吗 首先 我们
  • C# 从数据库加载单词并将它们添加到“选择”类型的列表中?

    我构建了一个从数据库表加载单词的系统 但我需要将这些单词添加到 选择 类型 语法构建所需的类型 列表中 这是我请求从数据库检索单词的代码 List
  • 正则表达式忽略引号之间的文本

    我有一个正则表达式 它是 s 这用于分割字符串 但我不想让它分开 如果它在引号中 我不会使用 split 而是使用 Pattern 和 Matcher A demo import java util regex Matcher import
  • 各种日期格式的正则表达式

    我是正则表达式的新手 我想知道是否有人可以提供帮助 我什至不确定正则表达式是否是我想做的事情的最佳选择 我有一个正在查看的字符串数组 我想找到数组中与各种日期格式匹配的所有项目 以下是我尝试匹配的示例格式 2012 年 4 月 1 日 当天
  • Java客户端找不到主节点:MasterNotDiscoveredException等待[1m]

    我正在使用 vagrant 并使用 debian 软件包在其上安装了 ES elasticsearch 1 1 1 deb 在我的网络应用程序中 我使用 jar org elasticsearch elasticsearch 1 1 1 我
  • 如何避免在 Scala 中编写令人困惑的 DSL

    我读过一些评论 指出 Scala 的灵活性使开发人员可以轻松编写难以理解和推理的 DSL DSL 之所以成为可能 是因为 we can 有时 https stackoverflow com q 1181533 5986907 omit 和括

随机推荐