我有下面的字符串。
"File-2022-03-08-S1-PAR-C-J1-SET"
字符串如何删除第二次和第三次出现的破折号(-)符号并保留所有其他符号?本质上,我希望日期(2023-03-08)读为2023 -03- 08。
dxxyhpgq1#
不确定,但你希望结果像File-20220308-S1-PAR-C-J1-SET一样吗如果是,则可以使用以下方法实现:
File-20220308-S1-PAR-C-J1-SET
string <- "File-2022-03-08-S1-PAR-C-J1-SET" modifiedString <- gsub("-(\\d{4})-(\\d{2})-", "-\\1\\2", string) modifiedString
字符串
s4chpxco2#
四处看看。
> gsub(r"{-(?=\d{2}\D)}", "", "File-2022-03-08-S1-PAR-C-J1-SET", perl=TRUE) [1] "File-20220308-S1-PAR-C-J1-SET"
t8e9dugd3#
比较基准:
> library(microbenchmark) > library(stringr) > string <- "File-2022-03-08-S1-PAR-C-J1-SET" > pattern <- "\\b[0-9]{4}-[0-9]{2}-[0-9]{2}\\b" > microbenchmark( Chris = str_remove_all(string, "(?<=\\d)-(?=\\d)"), jay.sf = gsub(r"{-(?=\d{2}\D)}", "", string, perl=TRUE), Manoj = gsub("-(\\d{4})-(\\d{2})-", "-\\1\\2", string), Rui = gsub("(^[^-]*-[^-]*)-([^-]*)-(.*$)", "\\1\\2\\3", string), TarJae = str_replace(string, pattern, str_remove_all(str_extract(string, pattern), "-")) ) Unit: microseconds expr min lq mean median uq max neval Chris 28.003 29.1510 31.85003 29.6020 30.8525 177.161 100 jay.sf 6.027 6.5600 7.13359 6.8265 7.1545 24.272 100 Manoj 7.093 7.4620 8.17991 7.7490 8.0565 30.094 100 Rui 8.323 8.8560 9.67641 9.1430 9.5530 19.147 100 TarJae 68.880 71.2375 74.03329 71.9960 74.5380 129.109 100
ccgok5k54#
假设输入总是所示的形式,这是一个字符串不包含-该字符串后面是-和所示的日期(即年,这不是2个字符,然后-和月,这是2个字符,然后-和天)。然后这里是一个紧凑的基本解决方案,它查找第一次出现的-后跟两个字符和另一个-并将其替换为这两个字符:
x <- "File-2022-03-08-S1-PAR-C-J1-SET" sub("-(..)-", "\\1", x) ## [1] "File-20220308-S1-PAR-C-J1-SET"
jecbmhm35#
这是一个基本的R解决方案。
x <- "File-2022-03-08-S1-PAR-C-J1-SET" gsub("(^[^-]*-[^-]*)-([^-]*)-(.*$)", "\\1\\2\\3", x) #> [1] "File-20220308-S1-PAR-C-J1-SET"
字符串创建于2023-12-24使用reprex v2.0.2
xkrw2x1b6#
下面是stringr函数与regex的组合:
stringr
library(stringr) string <- "File-2022-03-08-S1-PAR-C-J1-SET" # match date with format YYYY-MM-DD pattern <- "\\b[0-9]{4}-[0-9]{2}-[0-9]{2}\\b" str_replace(string, pattern, str_remove_all(str_extract(string, pattern), "-"))
个字符
piv4azn77#
您可以使用look-around语法。也就是说,如果-前面是d igit (?<=\\d),后面是d igit (?=\\d),则可以删除破折号字符:
-
d
(?<=\\d)
(?=\\d)
library(stringr) str_remove_all(string, "(?<=\\d)-(?=\\d)") [1] "File-20220308-S1-PAR-C-J1-SET"
7条答案
按热度按时间dxxyhpgq1#
不确定,但你希望结果像
File-20220308-S1-PAR-C-J1-SET
一样吗如果是,则可以使用以下方法实现:
字符串
s4chpxco2#
四处看看。
字符串
t8e9dugd3#
比较基准:
字符串
ccgok5k54#
假设输入总是所示的形式,这是一个字符串不包含-该字符串后面是-和所示的日期(即年,这不是2个字符,然后-和月,这是2个字符,然后-和天)。
然后这里是一个紧凑的基本解决方案,它查找第一次出现的-后跟两个字符和另一个-并将其替换为这两个字符:
字符串
jecbmhm35#
这是一个基本的R解决方案。
字符串
创建于2023-12-24使用reprex v2.0.2
xkrw2x1b6#
下面是
stringr
函数与regex的组合:个字符
piv4azn77#
您可以使用look-around语法。
也就是说,如果
-
前面是d
igit(?<=\\d)
,后面是d
igit(?=\\d)
,则可以删除破折号字符:字符串