2013-06-03 7 views
5

Po spędzeniu wielu godzin na szukaniu odpowiedzi i ponieważ w końcowej fazie desperacji jest 3:15, zadaję to podstawowe pytanie (ponieważ nic nie wiem o wyrażeniach regularnych).Usuń wszystkie kropki, ale pierwsze w łańcuchu znaków charytatywnych

Chcę zastąpić wszystkie oprócz pierwszych kolejnych kropek. Oto przykład tego, co chcę:

> 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? 

Wszelkie wskazówki, jak rozwiązać ten problem za pomocą regex docenione.

+0

jej prosty można zastąpić. +. – Civa

Odpowiedz

6

Wymień "" z "." w pierwszym regex:

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

Działa to również. Zasadniczo zastępujesz wszystkie kropki i kolejne kropki pojedynczą kropką.

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

Joshua dzięki. Wiedziałem, że to było tak oczywiste, że po prostu tego nie widziałem ... :) – Samo

Powiązane problemy