Scala регулярное выражение не работает - PullRequest
2 голосов
/ 10 января 2020

У меня есть следующая функция:

val Reg52 = """(?<!\S)(?!(?:[\d.]*\d){6})[0-9]{1,5}(?:\.[0-9]{1,2})?(?!\S)""".r
def verif_rg52 = udf((s: String) =>
    s match {
      case null            => 0
      case Reg52(item, _*) => 0
      case _               => 1
    })

Он должен проверить, содержит ли столбец данных кадр чисел в формате (5,2) -> максимум 5 цифр с максимум 2 после точки. Я протестировал регулярное выражение , и оно работает.

Но когда я пробую его в Scala:

val df1 = Seq(
  "22.0",
  "1000.22"
  ).toDF("id")

df1.withColumn("r", when(verif_rg52(col("id")) === 0 , "0").otherwise("1")).show(false)

, я получаю

+-------+---+
|id     |r  |
+-------+---+
|22.0   |1  |
|1000.22|1  |
+-------+---+

Но я должен получить 0, когда id = 22.0, потому что он уважает регулярное выражение. Любая помощь? Спасибо

Ответы [ 2 ]

3 голосов
/ 10 января 2020

Посмотрите на свое регулярное выражение. За всеми ведущими паренями ( стоит знак вопроса ?. У вас нет групп захвата, поэтому case Reg52(item, _*) не соответствует вашему шаблону.

Используйте case Reg52() или добавьте больше символов, чтобы указать нужные группы захвата.

0 голосов
/ 11 января 2020

Ваше регулярное выражение соответствует числам в контексте, чтобы их можно было использовать как отдельное использование

val Reg52 = """(\d{1,5}(?:\.\d{1,2})?)""".r

См. доказательства и объяснения .

I добавлен (...), чтобы вы могли получить доступ к значению в блоке match, используя какой-то case Reg52(num) => 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...