2015-04-15 19 views
5

Tôi muốn biết tại sao tôi có được hai chuỗi đầu ra khác nhau bằng cách sử dụng gsub và stringi. Liệu metacharacter "." không bao gồm các dòng mới trong stringi? Stringi có đọc "từng dòng" không?đầu ra khác nhau sử dụng stringi và gsub (sử dụng cùng một mẫu trên cùng một chuỗi)

Nhân tiện tôi không tìm thấy cách nào để thực hiện thay thế "đúng" bằng stringi vì vậy tôi cần sử dụng gsub tại đây.

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

Hãy thử 'stri_replace_all_regex (chuỗi,". *? Http "," http ", opts_regex = stri_opts_regex (dấu chấm = TRUE))'. – lukeA

+0

@ lukeA Tôi nghĩ bạn có thể đăng bình luận như một câu trả lời – akrun

+0

yep. Bằng cách này cũng làm việc này: 'stri_replace_all_regex (string," (? S). *? Http "," http ")' Bằng cách này tôi xem xét hành vi này lạ! –

Trả lời

2

Một cách sẽ được thiết lập . cũng để phù hợp với Terminators dòng thay vì dừng lại ở một dòng:

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

Bạn có biết tại sao họ thay đổi hành vi regex R (posix) chuẩn? Có phải trong Perl rằng dấu chấm không khớp với các dòng mới không? –

2

Theo mặc định - vì những lý do lịch sử, xem this tutorial - trong hầu hết các động cơ regex một dấu chấm không khớp với ký tự dòng mới. Như @lukeA đã đề xuất, để so khớp một dòng mới, bạn có thể đặt dotall tùy chọn thành TRUE trong các hàm dựa trên chuỗi regex.

Nhân tiện, gsub(..., perl=TRUE) cho kết quả phù hợp với stringi.

Các vấn đề liên quan