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
细节解释
- 正则里的
[^,]+表示匹配任意非逗号的字符,比\S+更通用(如果你的字段以后可能包含空白字符,这个写法依然有效)。 - 在模式匹配中,用
_来忽略我们不需要的分组(比如开头的11和中间的5),让代码更清晰。 - 使用Scala的字符串插值
s"$name,$typein,$number2"来拼接结果,比手动拼接逗号更简洁不易出错。
如果你确定字段里不会有空白字符,也可以把[^,]+换成\S+,效果是一样的:
val regtest = """(11|12|13),(\S+),(\S+),(\d+),(\d+)""".r
内容的提问来源于stack exchange,提问作者user9793373
相关产品推荐
相关产品推荐

