【问题标题】:Scala regex: get last number of stringScala正则表达式:获取字符串的最后一个数字
【发布时间】:2016-11-13 03:53:38
【问题描述】:

所以我有这个String

val line = "Displaying elements 1 - 4 of 4 in total"

我想解析总金额:4 在这种情况下。

这是我尝试过的:

val line = "Displaying elements 1 - 4 of 4 in total"
val pattern = "\\d".r
println(pattern.findAllMatchIn(line))

【问题讨论】:

  • line.split(' ')(6) '有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。'' - Jamie Zawinski

标签: regex scala


【解决方案1】:

regex API in Scala 只提供了一种方法来获取 first 匹配 (findFirstIn) 或 所有 匹配 (findAllIn),但不提供 最后 匹配。大多数语言都有一组类似的正则表达式方法,因为要获得最后一个正则表达式匹配,您可能很容易获得所有匹配项,但只引用最后一个。

在 Scala 中也是如此:

val line = "Displaying invoices 1 - 4 of 9 in total"
val pattern = """\d+""".r
println(pattern.findAllIn(line).toList.last)
// => 9

作为替代方案,对于当前场景,您也可以使用

val line = "Displaying invoices 1 - 4 of 4 in total"
val pattern = """\d+(?=\s*in total)""".r
println(pattern.findFirstIn(line))

IDEONE demo

\d+(?=\s*in total) 模式将找到 1 个或多个数字 (\d+),后跟 0+ 个空格和 in total 子字符串(请参阅正向预测 (?=\s*in total))。

【讨论】:

    【解决方案2】:

    您可以让greed 吃掉最后一个号码。

    .*\b(\d+)
    

    See demo at regex101

    如果您需要十进制数,请添加 lookbehind 并修改为 .*\b(?<![.,])(\d[\d.,]*)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多