使用正则表达式提取子串的Scala 2.11实现问询
没问题,我来帮你把Perl里的正则提取逻辑无缝迁移到Scala 2.11中~
你的核心需求是用(\d*)\*(C.*)这个正则捕获两个分组:第一个是数字部分32,第二个是从C开始的剩余字符串C1234*3,Scala里有两种常用的实现方式,和Perl的逻辑完全对齐:
方式一:用Scala模式匹配(最简洁惯用)
这种写法和Perl里的匹配赋值逻辑最像,直接把字符串和正则模式绑定,匹配成功后自动提取分组:
val s = "32*C1234*3" val re = """(\d*)\*(C.*)""".r s match { case re(x1, x2) => println(s"x1 = $x1, x2 = $x2") case _ => println("No match") }
运行后会输出:x1 = 32, x2 = C1234*3
方式二:通过Match对象提取分组
如果需要更灵活的处理(比如遍历多个匹配结果),可以用findFirstMatchIn获取匹配对象,再通过group方法提取分组:
val s = "32*C1234*3" val re = """(\d*)\*(C.*)""".r re.findFirstMatchIn(s) match { case Some(matchRes) => val x1 = matchRes.group(1) val x2 = matchRes.group(2) println(s"x1 = $x1, x2 = $x2") case None => println("No match") }
这里要注意,你之前尝试的findFirstIn返回的是整个匹配的字符串,而不是包含分组的匹配对象,所以没法直接拿到x1和x2,换成findFirstMatchIn就可以解决这个问题啦。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

