You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala正则表达式匹配失败求助:无法提取目标子串

解决你的Scala正则匹配问题

看起来你的正则表达式里有几个明显的错误,导致完全匹配不上输入字符串,所以才会进入默认分支返回空字符串。让我们一步步修复它:

问题分析

你的输入字符串是:11,FDESRTBGTY-DEDE-098-FDR,STR,5,1,这是一个用逗号分隔的5段内容。但你写的正则里有多余的\)闭括号(输入里根本没有括号),而且分组结构和实际的字段分隔不匹配,这直接导致匹配失败。

修正后的解决方案

我们可以写一个更简洁且准确的正则,直接匹配逗号分隔的各个字段,然后提取你需要的部分:

val str = "11,FDESRTBGTY-DEDE-098-FDR,STR,5,1"
// 正则说明:匹配开头的11/12/13,然后依次匹配逗号分隔的4个字段
val regtest = """(11|12|13),([^,]+),([^,]+),([^,]+),([^,]+)""".r

val stringOut = str match {
  // 忽略我们不需要的分组(第一个标识、第四个数字),用_占位
  case regtest(_, name, typein, _, number2) => s"$name,$typein,$number2"
  case _ => ""
}

println(stringOut) // 输出:FDESRTBGTY-DEDE-098-FDR,STR,1

细节解释

  1. 正则里的[^,]+表示匹配任意非逗号的字符,比\S+更通用(如果你的字段以后可能包含空白字符,这个写法依然有效)。
  2. 在模式匹配中,用_来忽略我们不需要的分组(比如开头的11和中间的5),让代码更清晰。
  3. 使用Scala的字符串插值s"$name,$typein,$number2"来拼接结果,比手动拼接逗号更简洁不易出错。

如果你确定字段里不会有空白字符,也可以把[^,]+换成\S+,效果是一样的:

val regtest = """(11|12|13),(\S+),(\S+),(\d+),(\d+)""".r

内容的提问来源于stack exchange,提问作者user9793373

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:53:36