Почему в регулярном выражении Scala регулярные выражения работают иначе - PullRequest
1 голос
/ 17 мая 2019

У меня есть простое регулярное выражение val emailRegex = "\\w+@\\w+\\.\\w+".r, которое соответствует простым электронным письмам (конечно, не для производства :).Когда я запускаю следующий код:

println(email match {
  case emailRegex(_) => "cool"
  case _ => "not cool"
})

printlnemailRegex.pattern.matcher(email).matches())

Он печатает not cool и true.Добавление якорей также не помогает: "^\\w+@\\w+\\.\\w+$".r дает тот же результат.Но когда я добавляю скобки "(\\w+@\\w+\\.\\w+)".r, он печатает cool и true.

Почему это происходит?

Ответы [ 2 ]

6 голосов
/ 17 мая 2019

Количество аргументов в шаблоне регулярного выражения должно соответствовать номеру группы захвата в регулярном выражении. У вашего регулярного выражения нет групп захвата, поэтому аргументов должно быть ноль:

println(email match {
  case emailRegex() => "cool"
  case _ => "not cool"
})

printlnemailRegex.pattern.matcher(email).matches())
5 голосов
/ 17 мая 2019

Поскольку сопоставление шаблонов с регулярным выражением связано с захватом групп регулярных выражений:

val email = "foo@foo.com"
val slightyDifferentEmailRegex = "(\\w+)@\\w+\\.\\w+".r // just add a group with two brackets
println(email match {
  case slightyDifferentEmailRegex(g) => "cool" + s" and here's the captured group: $g"
  case _ => "not cool"
})

отпечатков:

круто, и вот захваченная группа: foo

...