Scala Regex捕捉积极的前瞻

时间:2014-11-26 15:54:12

标签: regex scala

我试图使用正向前瞻来匹配任意数量的字符串,这样就可以实现'foo'和'bar AND ...等逻辑正则表达式匹配的内容以及包含'的内容' foo'和'bar'并捕获给定文本blob中的那些事件。

我正在使用正面预测来允许任何订购。我们并不关心这些情况,因此我对匹配的大小写不敏感。

示例正则表达式如下:

(?i)(?=.*\b(foo)\b)(?=.*\b(bar)\b)

现在,虽然这似乎适用于各种测试人员(http://regex101.com),但在以下Scala代码中似乎失败了:

val regex = """(?i)(?=.*\b(foo)\b)(?=.*\b(bar)\b)""".r
val results = regex.findAllIn("foo zinc bar")
val resultsList = result.toList

results ~ non-empty iterator
resultsList ~ List()

因此,我已经确认正则表达式似乎正确形成并捕获各种测试应用程序,并且Scala确实表明存在某种匹配,但不会产生任何结果。

有关为什么Scala看起来表现不同或任何修复的任何解释都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

Lookarounds和Anchors(前瞻,后瞻)不是比赛的直接部分,这意味着那里的元素将不会被捕获。

scala> "a(?=b)".r findFirstIn "babb"
res8: Option[String] = Some(a)

正如你只能看到" a"是比赛的一部分,而不是以下" b"。

你的正则表达式只匹配一个位置而没有捕获任何角色。

" foo zinc bar"
 ^

你可以说匹配发生在" 0"没有结果。 但是匹配是有效的,因为前瞻已被检查并通过。

捕获括号仅适用于匹配的字符,而不是在外观内。

对于您描述的问题,您可以使用

val regex = """(?i).*?\b(foo)\b.*?\b(bar)\b""".r

scala> for (regex(a,b) <- regex findFirstIn "foo zinc bar") yield (a,b)
res18: Option[(String, String)] = Some((foo,bar))