Scala - 正则表达式的解释

时间:2016-11-18 00:59:12

标签: regex scala capturing-group

假设我有一个名为df和regex的数据帧,如下所示:

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 => M.group(1).toUpperCase }

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

replaceAllIn方法的签名是

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

因此MMatch并且它有group方法,返回

  

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

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

所以{ M => M.group(1).toUpperCase }表示您将每个匹配替换为_更改为大写后的符号。

答案 1 :(得分:0)

M仅表示匹配,组(1)表示由正则表达式捕获的组(1)。考虑这个例子:

  

世界杯

如果你想将上面的例子与正则表达式匹配,你会写这样的\w+\s\w+,但是,你可以使用这些组,并用这种方式写出来:

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

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

请参阅右侧的群组: https://regex101.com/r/v0Ybsv/1