2016-12-15 13 views
6

Sử dụng stringr tôi đã cố gắng để phát hiện một dấu hiệu ở phần cuối của một chuỗi như sau:Tại sao là kết thúc của dòng (\ b) không được coi là ranh giới từ trong stringr/ICU và Perl

str_detect("my text €", "€\\b") # FALSE 

Tại sao tính năng này không hoạt động? Nó đang làm việc trong các trường hợp sau đây:

str_detect("my text a", "a\\b") # TRUE - letter instead of € 
grepl("€\\b", "2009in €") # TRUE - base R solution 

Nhưng nó cũng thất bại trong perl chế độ:

grepl("€\\b", "2009in €", perl=TRUE) # FALSE 

Vì vậy, những gì là sai về €\\b -regex? Regex €$ đang làm việc trong mọi trường hợp ...

Trả lời

4

Khi bạn sử dụng cơ sở chức năng R regex mà không perl=TRUE, TRE regex flavor được sử dụng.

Dường như ranh giới TRE từ:

  • Khi sử dụng sau khi một nhân vật phi từ phù hợp với kết thúc vị trí chuỗi, và
  • Khi sử dụng trước đó một nhân vật phi từ phù hợp với sự khởi đầu của vị trí chuỗi .

Xem các bài kiểm tra R:

> gsub("\\b\\)", "HERE", ") 2009in)") 
[1] "HERE 2009in)" 
> gsub("\\)\\b", "HERE", ") 2009in)") 
[1] ") 2009in HERE" 
> 

Đây không phải là một hành vi phổ biến của một word boundary trong PCRE và ICU regex hương vị nơi một ranh giới từ trước khi một nhân vật phi-word chỉ phù hợp khi nhân vật được trước với từ char, ngoại trừ vị trí bắt đầu của chuỗi (và khi được sử dụng sau một ký tự không phải từ, yêu cầu ký tự từ xuất hiện ngay sau ranh giới từ):

Có ba vị trí khác nhau ndaries:

- Trước ký tự đầu tiên trong chuỗi, nếu ký tự đầu tiên là ký tự từ.
- Sau ký tự cuối cùng trong chuỗi, nếu ký tự cuối cùng là ký tự từ.
- Giữa hai ký tự trong chuỗi, trong đó một ký tự là một từ và ký tự kia không phải là một ký tự từ.

2
\b 

tương đương với

(?:(?<!\w)(?=\w)|(?<=\w)(?!\w)) 

mà là để nói nó phù hợp với

  • giữa một char từ và char một tổ chức phi-word ,
  • giữa từ char và bắt đầu chuỗi và
  • giữa aw ord char và phần cuối của chuỗi.

là biểu tượng và ký hiệu không phải là ký tự từ.

$ uniprops € 
U+20AC <€> \N{EURO SIGN} 
    \pS \p{Sc} 
    All Any Assigned Common Zyyy Currency_Symbol Sc Currency_Symbols S Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Print X_POSIX_Print Symbol Unicode 

Nếu ngôn ngữ của bạn hỗ trợ tìm kiếm-behinds và tìm kiếm-aheads, bạn có thể sử dụng sau đây để tìm một ranh giới giữa một không gian và phi không gian (điều trị khi bắt đầu và kết thúc như một không gian).

(?:(?<!\S)(?=\S)|(?<=\S)(?!\S)) 
+1

'(?: (?

+0

@Wiktor Stribiżew, Cảm ơn. Tôi không muốn loại bỏ hoàn toàn mô hình vì nó có thể sử dụng cho người khác, nhưng tôi đã lặp lại tuyên bố này vì nó không có ích cho OP. – ikegami

+0

Có, nó sẽ hoạt động với các ICU (các chức năng stringr) và 'perl = TRUE'" được hỗ trợ "cơ sở R. –

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