сопоставлять временную метку на основе соответствия шаблону регулярных выражений scala - PullRequest
0 голосов
/ 28 августа 2018

Я написал следующий код:

val reg = "([\\d]{4})-([\\d]{2})-([\\d]{2})(T)([\\d]{2}):([\\d]{2})".r
val dataExtraction: String => Map[String, String] = {
  string: String => {
    string match {
      case reg(year, month, day, symbol, hour, minutes) =>
                 Map(YEAR -> year, MONTH -> month, DAY -> day, HOUR -> hour)
      case _  => Map(YEAR -> "", MONTH -> "", DAY -> "", HOUR -> "")
    }
  }
}
val YEAR = "YEAR"
val MONTH = "MONTH"
val DAY = "DAY"
val HOUR = "HOUR"

Предполагается, что эта функция применяется к строкам следующего формата: 2018-08-22T19:10:53.094Z

Когда я вызываю функцию:

dataExtractions("2018-08-22T19:10:53.094Z")

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Ваш шаблон соответствует только строкам, которые выглядят точно как yyyy-mm-ddThh:mm, в то время как шаблон, с которым вы тестируете, имеет миллисекунды и Z в конце.

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

Кроме того, позвольте мне показать вам более идиоматический способ написания вашего кода:

// Create a type for the data instead of using a map.
case class Timestamp(year: Int, month: Int, day: Int, hour: Int, minutes: Int)

// Use triple quotes to avoid extra escaping.
// Don't capture parts that you will not use.
// Add .* at the end to account for milliseconds and timezone.
val reg = """(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}).*""".r

// Instead of empty strings, use Option to represent a value that can be missing.
// Convert to Int after parsing.
def dataExtraction(str: String): Option[Timestamp] = str match {
  case reg(y, m, d, h, min) => Some(Timestamp(y.toInt, m.toInt, d.toInt, h.toInt, min.toInt))
  case _                    => None
}

// It works!
dataExtraction("2018-08-22T19:10:53.094Z")  // => Some(Timestamp(2018,8,22,19,10))
0 голосов
/ 28 августа 2018

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

val reg = "([\\d]{4})-([\\d]{2})-([\\d]{2})(T)([\\d]{2}):([\\d]{2})".r.unanchored
. . .
dataExtraction("2018-08-22T19:10:53.094Z")
//res0: Map[String,String] = Map(YEAR -> 2018, MONTH -> 08, DAY -> 22, HOUR -> 19)

Но комментарий @CAustin верен, вы можете просто позволить Java LocalDateTime API справляться со всеми тяжелыми задачами.

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter._

val dt = LocalDateTime.parse("2018-08-22T19:10:53.094Z", ISO_DATE_TIME)

Теперь у вас есть доступ ко всем данным без фактического сохранения их в Map.

dt.getYear        //res0: Int = 2018
dt.getMonthValue  //res1: Int = 8
dt.getDayOfMonth  //res2: Int = 22
dt.getHour        //res3: Int = 19
dt.getMinute      //res4: Int = 10
dt.getSecond      //res5: Int = 53
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...