2016-11-18 40 views
-1

假設我稱之爲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 => M.group(1).toUpperCase }

什麼是M?什麼是組(1)?

我可以猜到發生了什麼,因爲我知道預期的輸出是userId,但我不認爲我完全理解這是如何發生的。

有人能幫我理解嗎?會真的很感激它。

謝謝!

回答

0

replaceAllIn方法的簽名是

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

MMatch,它有一個group方法,它返回

匹配的字符串I組或null如果沒有匹配

A 在正則表達式中與括號內的(子)正則表達式匹配(.,即您的案例中的一個符號)。你可以有幾個捕獲組,你可以命名它們或通過索引引用它們。您可以閱讀關於捕獲組here的更多信息,以及有關Regex的Scala API文檔。

因此{ M => M.group(1).toUpperCase }意味着您將每個匹配替換爲_更改爲大寫之後的符號。

0

M只是表示匹配,而組(1)是指由正則表達式捕獲的組(1)。如果你想匹配上面正則表達式的例子,你會寫這樣的事情\w+\s\w+,但是,您可以使用組

世界盃

,並寫:考慮下面這個例子這樣:

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

正則表達式中的括號用於表示組。在上面的示例中,第一個(\w+)是組1,它將匹配World。第二個(\w+)將與正則表達式中的第2組匹配,即Cup。如果你想匹配整個事情,你可以使用組0匹配整個事情。

看到在這裏行動組在右邊: https://regex101.com/r/v0Ybsv/1