Удалить текст после второго двоеточия

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

a <- "2016-12-31T18:31:34Z"
b <- "2016-12-31T18:31Z"

Я пытался сопоставить две группы двоеточий, но не могу понять, как удалить вторую группу совпадений.

sub("(:.*){2}", "", "2016-12-31T18:31:34Z")

3 ответа

Решение

Вы можете использовать регулярное выражение: (:[^:]+):.*

который вы можете проверить: regex101 и использовать как

sub("(:[^:]+):.*", "\\1", "2016-12-31T18:31:34Z")
[1] "2016-12-31T18:31"
sub("(:[^:]+):.*", "\\1", "2016-12-31T18:31Z")
[1] "2016-12-31T18:31Z"

Допустим, у вас есть вектор:

date <- c("2016-12-31T18:31:34Z", "2016-12-31T18:31Z", "2017-12-31T18:31Z")

Затем вы можете разделить его на ":" и взять только первые два элемента, отбрасывая остальные:

out = sapply(date, function(x) paste(strsplit(x, ":")[[1]][1:2], collapse = ':'))

Используйте его как возможность сделать частичный валидатор временной метки против простого таргетинга на любые конечные секунды:

remove_seconds <- function(x) {
  require(stringi)
  x <- stri_trim_both(x)
  x <- stri_match_all_regex(x, "([[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}T[[:digit:]]{2}:[[:digit:]]{2})")[[1]]
  if (any(is.na(x))) return(NA)  
  sprintf("%sZ", x[,2])
}

Таким образом, вы будете ловить ошибочные строки меток времени.

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