Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 更正格式错误的日期_Regex_R_Date - Fatal编程技术网

Regex 更正格式错误的日期

Regex 更正格式错误的日期,regex,r,date,Regex,R,Date,我在格式良好的日期之间有一些不正确的日期,如下所示: df <- data.frame(col=c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")) 我要绞尽脑汁的是-01部分,因为删除这些,也会删除部分正确格式的日期 编辑:格式为mm.dd.yy我注意到,

我在格式良好的日期之间有一些不正确的日期,如下所示:

df <- data.frame(col=c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05"))
我要绞尽脑汁的是
-01
部分,因为删除这些,也会删除部分正确格式的日期


编辑:格式为
mm.dd.yy

我注意到,如果日期前缀的条目为-1或--1,则只存在非法后缀,即-01。 您可以首先获取数组中的所有值。 因此,您将有一个数组--1.1.11-01“,”--1.11.12-1“,”--1.1.13-01“,”--1.1.14-01“,”--1.10.10-01“,“-1.10.11-01”

现在可以检查前缀是-1还是--1。如果存在任何这样的东西,那么您可以将其标记为删除后缀-01。 根据上面的输入模式,我觉得上面的策略会起作用


请告诉我该策略是否有效

一个简单的regexp可以很好地解决这类问题:

> df <- c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")
> df
 [1] "--1.1.11-01"   "--1.11.12-1"   "--1.1.13-01"   "--1.1.14-01"   "--1.10.10-01"  "-1.10.11-01"   "---1.10.12-01"
 [8] "2010-03-31"    "2010-04-01"    "2010-04-05"   
> df <- sub(".*([0-9]{4}\\-[0-9]{2}\\-[0-9]{2}|[0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}).*", "\\1", df)
> df
 [1] "1.1.11"     "1.11.12"    "1.1.13"     "1.1.14"     "1.10.10"    "1.10.11"    "1.10.12"    "2010-03-31" "2010-04-01"
[10] "2010-04-05"
>测向
[1] "--1.1.11-01"   "--1.11.12-1"   "--1.1.13-01"   "--1.1.14-01"   "--1.10.10-01"  "-1.10.11-01"   "---1.10.12-01"
[8] "2010-03-31"    "2010-04-01"    "2010-04-05"   
>df-df
[1] "1.1.11"     "1.11.12"    "1.1.13"     "1.1.14"     "1.10.10"    "1.10.11"    "1.10.12"    "2010-03-31" "2010-04-01"
[10] "2010-04-05"
请注意,我将其设置为字符向量,而不是data.frame


解决方案本身只是匹配一个模式或另一个模式,然后用子模式替换掉其余的模式。

只需删除开头的所有非单词字符或结尾的
-01
-1
,前面没有
-
+两位数字

> x <- c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")
> gsub("^\\W+|(?<!-\\d{2})-0?1$", "", x, perl=T)
 [1] "1.1.11"     "1.11.12"    "1.1.13"     "1.1.14"     "1.10.10"   
 [6] "1.10.11"    "1.10.12"    "2010-03-31" "2010-04-01" "2010-04-05"

>xgsub(“^\\W+|)(?这里是一个使用
sub
的非常简单的解决方案

sub('^-+([^-]+).+', '\\1', df$col)
# [1] "1.1.11"     "1.11.12"    "1.1.13"     "1.1.14"     "1.10.10"   
# [6] "1.10.11"    "1.10.12"    "2010-03-31" "2010-04-01" "2010-04-05"

您能告诉我们正确日期的格式吗?我是说dd.mm.yy或mm.dd.yy?很好用。我接受@LauriK solution,理由是首先正确回答问题。谢谢。谢谢,我真的很喜欢您的解决方案,它很简单,我理解:)
sub('^-+([^-]+).+', '\\1', df$col)
# [1] "1.1.11"     "1.11.12"    "1.1.13"     "1.1.14"     "1.10.10"   
# [6] "1.10.11"    "1.10.12"    "2010-03-31" "2010-04-01" "2010-04-05"