Scala - Объяснение для регулярного выражения

Предполагая, что у меня есть датафрейм с именем 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.

Я понимаю, что делают функции colcolRenamed и replaceAllIn. Что я не понимаю, так это часть: { M => M.group(1).toUpperCase }

Что такое М? Что такое группа (1)?

Я могу догадаться, что происходит, потому что я знаю, что ожидаемый результат - userId, но я не думаю, что полностью понимаю, как это происходит.

Может ли кто-нибудь помочь мне понять это? Был бы очень признателен.

Спасибо!

2 ответа

Подпись replaceAllIn метод

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

Чтобы M это Match и у него есть group метод, который возвращает

Соответствующая строка в группе i или ноль, если ничего не найдено

Группа в регулярных выражениях - это то, что соответствует (под) регулярному выражению в скобках (. т. е. один символ в вашем случае). У вас может быть несколько групп захвата, и вы можете назвать их или ссылаться на них по индексу. Подробнее о захвате групп можно прочитать здесь и в документации по Scala API для Regex,

Так { M => M.group(1).toUpperCase } означает, что вы заменяете каждое совпадение символом в нем, который идет после _ изменилось на верхний регистр

M просто означает совпадение, а группа (1) относится к группе (1), захваченной регулярным выражением. Рассмотрим этот пример:

Кубок мира

если вы хотите сопоставить приведенный выше пример с регулярным выражением, вы напишите что-то вроде этого \w+\s\w+однако вы можете использовать группы и записать их следующим образом:

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

Скобки в Regex используются для обозначенных групп. В приведенном выше примере первый (\w+) это группа 1, которая будет соответствовать World, Второй (\w+) будет соответствовать группе 2 в регулярном выражении, которое Cup, Если вы хотите соответствовать целиком, вы можете использовать группу 0, которая будет соответствовать целиком.

Смотрите группы в действии здесь на правой стороне: https://regex101.com/r/v0Ybsv/1

Другие вопросы по тегам