2015-04-15 6 views
5

Desidero sapere perché ottengo due stringhe di output diverse utilizzando gsub e stringi. Il metacarattere "." non includere nuove righe in stringi? Stringi legge "riga per riga"?output diverso utilizzando stringi e gsub (utilizzando lo stesso modello sulla stessa stringa)

Tra l'altro non ho trovato alcun modo per eseguire la sostituzione "corretta" con stringi quindi ho dovuto usare gsub qui.

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

Provare 'stri_replace_all_regex (stringa,". *? Http "," http ", opts_regex = stri_opts_regex (dotall = TRUE))'. – lukeA

+0

@lukeA Penso che potresti postare il commento come risposta – akrun

+0

sì. Tra l'altro anche questo funziona: 'stri_replace_all_regex (stringa," (? S). *? Http "," http ")' A proposito, considero questo comportamento strano! –

risposta

2

Un modo potrebbe essere quello di impostare . per abbinare anche terminatori di linea invece di fermarsi ad una linea:

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

Sai perché hanno cambiato il comportamento regex standard R (posix)? È in Perl che il punto non corrisponde a nuove linee? –

2

Per impostazione predefinita - per ragioni storiche, vedere this tutorial - nella maggior parte dei motori di regex un il punto non corrisponde a un carattere di nuova riga. Come suggerito da @lukeA, per abbinare una nuova riga è possibile impostare l'opzione dotall su TRUE nelle funzioni basate su espressioni reeiche.

A proposito, gsub(..., perl=TRUE) fornisce risultati coerenti con stringi.

Problemi correlati