2012-11-14 41 views
7

Tôi có regex sau chia tách trên bất kỳ dấu cách hoặc dấu câu nào. Làm cách nào để loại trừ 1 hoặc nhiều ký tự dấu câu từ :punct:? Giả sử tôi muốn loại trừ dấu nháy đơn và dấu phẩy. Tôi biết tôi có thể sử dụng rõ ràng [all punctuation marks in here] thay vì [[:punct:]] nhưng tôi hy vọng một phương pháp loại trừ.Regex; loại trừ tất cả dấu chấm câu ngoại trừ

X <- "I'm not that good at regex yet, but am getting better!" 
strsplit(X, "[[:space:]]|(?=[[:punct:]])", perl=TRUE) 

[1] "I"  "'"  "m"  "not"  "that" "good" "at"  "regex" "yet"  
[10] ","  ""  "but"  "am"  "getting" "better" "!" 

Trả lời

8

Không rõ tôi muốn kết quả gì, nhưng bạn có thể sử dụng các lớp phủ định like this answer.

R> strsplit(X, "[[:space:]]|(?=[^,'[:^punct:]])", perl=TRUE)[[1]] 
[1] "I'm"  "not"  "that" "good" "at"  "regex" "yet," 
[8] "but"  "am"  "getting" "better" "!"  
+1

Đầu tôi đau ... –

0

Bạn có thể áp đặt một hạn chế đến một subpattern PCRE trực tiếp với một (?![',])negative lookahead thất bại của trận đấu nếu char bên cạnh bên phải là ' hoặc ,:

[[:space:]]|(?=(?![',])[[:punct:]]) 
       ^^^^^^^^ 

Xem regex demo.

Chi tiết

  • [[:space:]] - bất kỳ khoảng trắng
  • | - hoặc
  • (?=(?![',])[[:punct:]]) - một lookahead tích cực đòi hỏi đó, ngay bên phải của vị trí hiện tại, không có ', và có bất kỳ ký tự dấu chấm câu nào không phải là ' hoặc , (hiệu quả, yêu cầu bất kỳ ký hiệu dấu câu nào khác ngoài ',).

Xem R online demo

X <- "I'm not that good at regex yet, but am getting better!" 
strsplit(X, "[[:space:]]|(?=(?![',])[[:punct:]])", perl=TRUE) 
[[1]] 
[1] "I'm"  "not"  "that" "good" "at"  "regex" "yet," 
[8] "but"  "am"  "getting" "better" "!" 
Các vấn đề liên quan