【问题标题】:Scala Regex Extractor with OR operator带有 OR 运算符的 Scala 正则表达式提取器
【发布时间】:2015-07-01 00:07:32
【问题描述】:

我有这个冗长的代码,可以在 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 }

【问题讨论】:

    标签: regex scala capture-group


    【解决方案1】:

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

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

    另外,你真的从cd 中得到c 吗?根据您的正则表达式判断,如果我们谈论的是捕获组,您应该会收到 d

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

    【讨论】:

    • 另外值得注意的是,锚是无关的,因为模式匹配提取器 regex.match 整个输入。对于这种简单的情况,{ case r1(v) => Some(v) case r2(v) => Some(v)} 更为明显。另外,使用(?x) 忽略嵌入的空格。
    • 您可以坚持使用原始公式,使用unapplySeq 或:r1.findFirstMatchIn(s) orElse r2.findFirstMatchIn(s) map (_ group 1)
    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 2012-10-30
    • 2011-01-03
    • 1970-01-01
    • 2012-11-16
    • 2013-11-18
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多