2013-06-03 31 views
5

花了几个小时寻找答案,因为它是在绝望的最后阶段3:15 AM我问这个基本问题(因为我对正则表达式一无所知)。删除所有点,但第一个在charchter字符串

我想替换除连续第一个点外的所有点。这里是我想要的一个例子:

> names.orig <- c("test & best", "test & worse &&&& ? do") 
> names <- make.names(names.orig) 
> names 
[1] "test...best"    "test...worse.........do" 
> 
> # But I want this instead: 
> # [1] "test.best"    "test.worse.do" 
> 
> # Desperatley tried: 
> gsub("\\.{2, }", "", names) 
[1] "testbest" "testworsedo" 
> gsub("\\G((?!^).*?|[^\\.]*\\.*?)\\.", "", names) 
Error in gsub("\\G((?!^).*?|[^\\.]*\\.*?)\\.", "", names) : 
    invalid regular expression '\G((?!^).*?|[^\.]*\.*?)\.', reason 'Invalid regexp' 
> # etc. 
> 
> # The only thing that works for me is this 
> unlist(lapply(strsplit(names, "\\."), function(x) paste(x[x != ""], collapse="."))) 
[1] "test.best"  "test.worse.do" 
> 
> # But, really, what is the right regex in combination with what? 

任何提示如何解决与正则表达式赞赏。

+0

其简单可以替换。+来。 – Civa

回答

6

更换"""."在你的第一个正则表达式:

R> nms <- make.names(c("test & best", "test & worse &&&& ? do")) 
R> gsub("\\.{2, }", ".", nms) 
[1] "test.best"  "test.worse.do" 

这也适用。基本上,你用一个点代替所有的点和连续的点。

R> gsub("\\.+", ".", nms) 
[1] "test.best"  "test.worse.do" 
+0

约书亚感谢。我知道这很明显,我只是看不到它...... :) – Samo

相关问题