我如何指示 Scala 的正则表达式匹配器 select 最左边的交替

How do I instruct Scala's regex matcher to select the leftmost alternation

我在尝试从 scala.util.matching.Regex 中检索值时遇到了正则表达式交替问题。我在使用 findAllMatchIn 方法时尝试了默认和 unanchored 初始化状态。

使用 (1e)|(a1) 的正则表达式模式和 a1e 的示例文本,我想接收 1e 因为 我已将它放在第一个交替位置。我很困惑为什么我实际上收到的是值 a1 而不是 ,它处于第二个交替位置 .

在查看了多个处理输入字符串中的多个匹配项的问题后,我没有找到任何解决 如何处理交替而不是按正确顺序排列的问题,我已经做到了。

我可以使用什么方法(如果有的话)来取回我想要的 1e 值,或者取回 returns 两个值,一个对应于它匹配的每个交替?

下面是我的 IntelliJ Scala 工作表 (here's the code in Scastie) 中的代码示例:

import scala.util.matching.Regex

val regexStringLongOrLat: String =
  """(1e)|(a1)"""
val regexLongOrLat: Regex = regexStringLongOrLat.r.unanchored

val sample =
  "a1e"

val test2 =
  regexLongOrLat
    .findAllMatchIn(sample)
    .toList

println(test2) //This should return List(1e)

它 returns "a1" 因为这是正则表达式引擎遍历字符串时遇到的第一个匹配项。

在这种情况下,您可以通过负向预测获得想要的结果。

"(1e|a1(?!e))".r
              .findAllIn("a1e")
              .toList
//res0: List[String] = List(1e)

注:"(a1(?!e)|1e)".rreturns结果相同