scala模式与regexp lookbehind运算符匹配

时间:2015-10-30 19:20:59

标签: regex scala pattern-matching

我正在尝试使用正则表达式和模式匹配从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 }

但我想知道是否可以使用模式匹配的前瞻/后方运算符。

提前谢谢。

1 个答案:

答案 0 :(得分:5)

是的,但在模式上与don't get a call Matcher.find匹配,Regex.findAllInUnAnchoredRegex,因此您必须使用{Regex.unanchored将其变为setNull 3}}(或匹配第一步中的所有内容):

val reg = "((?<=a)b)".r.unanchored
// ".*((?<=a)b)".r would also work
"ab" match { case reg(x) => x }

ScalaDoc中的关键条目是:

  

此方法默认尝试匹配整个输入;要找到下一个匹配的子序列,请使用未锚定的正则表达式。

(强调我的)。