【问题标题】:Scala - Explanation for regex statementScala - 正则表达式的解释
【发布时间】:2016-11-18 00:59:11
【问题描述】:

假设我有一个名为 df 和正则表达式的数据框,如下所示:

var df2 = df
regex = new Regex("_(.)")
for (col <- df.columns) {
      df2 = df2.withColumnRenamed(col, regex.replaceAllIn(col, { M => M.group(1).toUpperCase }))
    }

我知道这段代码正在重命名 df2 的列,这样如果我有一个名为“user_id”的列名,它将成为 userId。

我了解 withcolumnRenamed 和 replaceAllIn 函数的作用。我不明白的是这部分:{ M =&gt; M.group(1).toUpperCase }

什么是M?什么是组(1)?

我可以猜到发生了什么,因为我知道预期的输出是 userId,但我认为我并不完全理解这是怎么发生的。

有人可以帮助我理解这一点吗?真的很感激。

谢谢!

【问题讨论】:

    标签: regex scala capturing-group


    【解决方案1】:

    M 只是代表匹配,组(1)指的是被正则表达式捕获的组(1)。考虑这个例子:

    世界杯

    如果你想用正则表达式匹配上面的例子,你会写这样的\w+\s\w+,但是,你可以利用组,这样写:

    (\w+)\s(\w+)
    

    Regex 中的括号用于表示组。在上面的示例中,第一个 (\w+) 是组 1,它将匹配 World。第二个(\w+) 将匹配正则表达式中的第2 组Cup。如果你想匹配整个事物,你可以使用组 0 来匹配整个事物。

    在右侧查看正在运行的组: https://regex101.com/r/v0Ybsv/1

    【讨论】:

      【解决方案2】:

      replaceAllIn方法的签名是

      replaceAllIn(target: CharSequence, replacer: (Match) ⇒ String): String
      

      所以M 是一个Match 并且它有一个group 方法,它返回

      第i组中匹配的字符串,如果没有匹配则为null

      正则表达式中的 组 与括号中的(子)正则表达式匹配(.,即您的情况下的一个符号)。您可以拥有多个捕获组,您可以命名它们或通过索引引用它们。您可以阅读更多关于捕获组 here 和 Regex 的 Scala API 文档。

      所以{ M =&gt; M.group(1).toUpperCase } 意味着您将每个匹配项替换为其中_ 更改为大写之后的符号。

      【讨论】:

        猜你喜欢
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多