我试图使用正向前瞻来匹配任意数量的字符串,这样就可以实现'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看起来表现不同或任何修复的任何解释都将受到赞赏。
答案 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))