Удалить текст после второго двоеточия
Мне нужно удалить все после второго двоеточия. У меня есть несколько форматов дат, которые необходимо очистить с использованием одного и того же алгоритма.
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])
}
Таким образом, вы будете ловить ошибочные строки меток времени.