2015-04-15 10 views
5

Chciałbym wiedzieć, dlaczego otrzymuję dwa różne ciągi wyjściowe za pomocą gsub i stringi. Czy metaznak "." nie uwzględnia nowych linii w stringi? Czy stringi czytają "linia po linii"?inne wyjście za pomocą stringi i gsub (używając tego samego wzorca na tym samym łańcuchu)

Nawiasem mówiąc, nie znalazłem sposobu na dokonanie "poprawnej" zamiany stringi, więc musiałem użyć gsub tutaj.

string <- "is it normal?\n\nhttp://www.20minutes.fr" 

> gsub(" .*?http"," http", string) 
[1] "is http://www.20minutes.fr" 

> stri_replace_all_regex(string, " .*?http"," http") 
[1] "is it normal?\n\nhttp://www.20minutes.fr" 
+4

Spróbuj 'stri_replace_all_regex (ciąg znaków,. *? Http", "http", opts_regex = stri_opts_regex (dotall = TRUE)) '. – lukeA

+0

@lukeA Myślę, że możesz opublikować komentarz jako odpowiedź – akrun

+0

tak. Przy okazji również to działa: 'stri_replace_all_regex (string," (? S). *? Http "," http ")" Przy okazji uważam to zachowanie za dziwne! –

Odpowiedz

2

Jednym ze sposobów byłoby ustawić . również dopasować terminatory linii, zamiast zatrzymać się na linii:

stri_replace_all_regex(string, " .*?http"," http", 
         opts_regex = stri_opts_regex(dotall = TRUE)) 
+1

Czy wiesz, dlaczego zmienili standardowe zachowanie regexów R (posix)? Czy w Perlu kropka nie pasuje do nowych linii? –

2

Domyślnie - ze względów historycznych, zobacz this tutorial - w większości silników regex A kropka nie pasuje do znaku nowej linii. Zgodnie z sugestią @lukeA, aby dopasować znak nowej linii, można ustawić opcję dotall na TRUE w funkcjach opartych na ciągach regex.

Przy okazji, gsub(..., perl=TRUE) daje wyniki zgodne z stringi.

Powiązane problemy