Scala正则模式匹配异常:排除数字/空格后逗号的匹配问题
问题原因及解决办法
你的Scala模式匹配失败的核心原因是正则表达式没有定义捕获组,但你在匹配分支里写了三个捕获组占位符。
具体问题分析
Scala的Regex模式匹配规则是:如果正则里用()定义了N个捕获组,模式匹配时才能用Regex(_, _, ...)(共N个占位符)的写法。而你写的正则^.*\D\s*,.*$没有任何捕获组,整个表达式只是用来判断字符串是否符合规则,没有提取任何子串,所以ContainCommaSeparatorExcludingDigitBeforeComma(_, _, _)这种写法完全不匹配,所有输入都会走到默认的case _分支。
修正后的代码
直接去掉匹配分支里的占位符即可,写法有两种:
写法一(推荐)
private val ContainCommaSeparatorExcludingDigitBeforeComma = """^.*\D\s*,.*$""".r address match { case ContainCommaSeparatorExcludingDigitBeforeComma() => print("found") case _ => print("not found") }
写法二
private val ContainCommaSeparatorExcludingDigitBeforeComma = """^.*\D\s*,.*$""".r address match { case ContainCommaSeparatorExcludingDigitBeforeComma => print("found") case _ => print("not found") }
额外说明
如果之后需要捕获逗号前后的内容,可以给正则加上捕获组,比如:
private val ContainCommaSeparatorExcludingDigitBeforeComma = """^(.*\D\s*),(.*)$""".r address match { case ContainCommaSeparatorExcludingDigitBeforeComma(beforeComma, afterComma) => println(s"找到符合规则的逗号,前面内容:$beforeComma,后面内容:$afterComma") case _ => print("not found") }
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

