0

我有这个冗长的代码,可以在 Scala 中短路正则表达式提取/匹配。这会尝试将字符串与第一个 Regex 匹配,如果不匹配,它会尝试将字符串与第二个 Regex 匹配。

val regex1 : scala.util.matching.Regex = "^a(b)".r
val regex2 : scala.util.matching.Regex = "^c(d)".r

val s = ? 
val extractedGroup1 : Option[String] = s match { case regex1(v) => Some(v) case _ => None }
val extractedGroup2 : Option[String] = s match { case regex2(v) => Some(v) case _ => None}

val extractedValue = extractedGroup1.orElse(extractedGroup2)

结果如下:

s == "ab" 然后提取值 == "b"

s == "cd" 然后提取值 == "c"

s == "gg" 然后提取值 == 无。

我的问题是我们如何将两个正则表达式与正则表达式或运算符组合成一个正则表达式,并且仍然使用 Scala 提取器。我试过这个,但总是没有情况。

val regex : scala.util.matching.Regex = "^a(b)$ | ^c(d)$".r
val extractedValue: s match { case regex(v) => Some(v) case _ => None }
4

1 回答 1

0

不要在正则表达式中使用生活质量空间,尽管它们感觉非常 scala-esque,但它们可能被认为是文学性的,并且您的程序期望 endOfString 之后应该有一个空格或 startOfString 之前应该有一个空格,这显然不是这种情况. 尝试^(?:a(b)|c(d))$,这与您在不重复^and的情况下所做的相同$

您自己的^a(b)$|^c(d)$也可以工作(如果您删除空格)。

还有,你真的摆脱ccd吗?从您的正则表达式来看d,如果我们谈论的是捕获组,您应该会得到 。

另外,请注意您正在提取捕获组。如果结合正则表达式,提取的d将是 2 美元,而b将是 1 美元。

于 2015-07-01T00:55:22.223 回答