2012-12-27 53 views
6

Có thể sử dụng cụm từ thông dụng để khớp với tất cả các từ nhưng chỉ khớp một từ duy nhất? Tôi biết có những cách khác để làm điều này tuy nhiên tôi quan tâm đến việc biết nếu điều này là có thể với việc sử dụng một biểu thức chính quy.Cụm từ thông dụng - khớp với tất cả các từ nhưng chỉ khớp các từ duy nhất một lần

Ví dụ tôi hiện đang có các biểu hiện sau:

(\w+\b)(?!.*\1) 

và chuỗi sau:

glass shoes door window door glasses. window glasses 

Đối với hầu hết các phần biểu thức hoạt động và phù hợp với những lời sau đây:

shoes 
door 
window 
glasses 

Có hai vấn đề với điều này:

  1. Kết quả phù hợp cho chuỗi con đang được thực hiện trên "kính" bằng "kính", điều này không chính xác.

  2. "kính" và "kính". nên khớp nhưng hiện tại thì không.

Trận chung kết nên là:

shoes 
door 
window 
glasses 
glass 

Trả lời

7

Khá gần, chỉ cần readd các \b trong lookahead tiêu cực

/(\w+\b)(?!.*\1\b)/ 

Xem nó trên Rubular

+0

Tôi tự hỏi tại sao '\ 1' dường như không khớp với' \ b' từ nhóm đầu tiên. Không nên '\ 1' khớp với mọi thứ bên trong nhóm và không chỉ' \ w + '? – pemistahl

+0

@ maček Wow! Cảm ơn bạn rất nhiều, tôi đã dành rất nhiều thời gian để cố gắng tìm hiểu điều này! – Isomorph

+0

@PeterStahl Lý do tại sao bạn phải thêm '\ b' là đảm bảo rằng lookahead phủ định khớp với toàn bộ một từ và không chỉ là một chuỗi con, theo mặc định nó khớp với các phần tử. – Isomorph

2

Đúng như maček's answer, nhưng với một \ b thêm trước khi tham chiếu trở lại, otherw ISE nếu bạn có

glass shoes door window door glasses. window glasses sunglasses

Bạn muốn bỏ lỡ một trận đấu kính như nó tìm thấy nó trong kính mát từ.

/(\w+\b)(?!.*\b\1\b)/

+0

Bạn cũng nên thêm một '\ b' trước' \ w' để không thất bại cho 'kính râm kính ' – Titus

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