Scala模式匹配与正则表达式后顾运算符

4
我试图使用正则表达式和模式匹配从字符串中提取一个值:
val reg = """((?<=a)b)""".r
"ab" match { case reg(x) => x }

无论我怎么尝试,它仍然会抛出MatchError。但是,如果我尝试以下方法:
reg.findAllIn("ab").mkString

这个正则表达式的表现符合预期:res28: String = b

当然,我也可以简单地更改正则表达式并添加另一个组:

val reg = """(a)(b)""".r
"ab" match { case reg(_,x) => x }

但是我想知道是否可以在模式匹配中使用前后预查/回顾运算符。
提前感谢你的帮助。
1个回答

7
是的,但在模式匹配中,您没有调用 Matcher.find,就像您在Regex.findAllIn中做的那样,所以您必须使用Regex.unanchored将其转换为UnAnchoredRegex(或者一次性匹配所有内容):
val reg = "((?<=a)b)".r.unanchored
// ".*((?<=a)b)".r would also work
"ab" match { case reg(x) => x }

ScalaDoc 中的关键词条为:
尝试默认匹配整个输入;要查找下一个匹配子序列,请使用非锚定的正则表达式 (强调我的)。

2
"unanchored" 没有得到足够的曝光。 - som-snytt
@som-snytt:你说的曝光是什么意思? - Francis Toth
1
在文档中提及,这样人们就知道要使用它。如果你从Java转过来的话,你不会这么做。 - som-snytt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接