我正在尝试使用正则表达式和模式匹配从String中提取值:
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 }
但我想知道是否可以使用模式匹配的前瞻/后方运算符。
提前谢谢。
答案 0 :(得分:5)
是的,但在模式上与don't get a call Matcher.find
匹配,Regex.findAllIn
,UnAnchoredRegex
,因此您必须使用{Regex.unanchored
将其变为setNull
3}}(或匹配第一步中的所有内容):
val reg = "((?<=a)b)".r.unanchored
// ".*((?<=a)b)".r would also work
"ab" match { case reg(x) => x }
ScalaDoc中的关键条目是:
此方法默认尝试匹配整个输入;要找到下一个匹配的子序列,请使用未锚定的正则表达式。
(强调我的)。