2012-07-30 17 views
5

Chcę wyczyścić ciąg znaków zawierający znaki cudzysłowu. Chcę usunąć znaki ujęte w cudzysłów na końcu i początku łańcucha, ale zachować wszystkie znaki zapytania w ciągu znaków. To, co wymyśliłem, jest następujące.usuń cudzysłowy z ciągu znaków na początku i końcu, tylko jeśli oba są obecne.

library(stringr) 
s1 <- "\"He said:\"Hello\" - some word\"" 
str_replace_all(s1, "(^\\\")|(\\\"$)", "") 

> [1] "He said:\"Hello\" - some word" 

Co walczę ze teraz jest to, że chcę tylko, aby usunąć cudzysłowy tylko wtedy, gdy istnieje jeden na początku i na końcu. W przeciwnym razie. Poniższe wyrażenie niesłusznie usuwa wiodącą.

s2 <- "\"Hello!\" he said" 
str_replace_all(s2, "(^\\\")|(\\\"$)", "") 

> [1] "Hello!\" he said" 

Oto mój regex powinien wskazywać, że chcę tylko, aby usunąć je w przypadku, gdy cały łańcuch jest owinięty w uciekły cudzysłowie. Jak mogę to zrobić?

Odpowiedz

7

Poniżej regex wydaje się działać na swoich przykładach:

s <- c("\"He said:\"Hello\" - some word\"", "\"Hello!\" he said") 

regex używa nawiązań wstecznych (\\1), aby powrócić tylko ciąg wewnątrz czołowego cytatem ^\" i wleczonego cytatem \"$:

r <- gsub("^\"(.*)\"$", "\\1", s) 

Rezultat:

cat(r, sep="\n") 
He said:"Hello" - some word 
"Hello!" he said 
Powiązane problemy