2012-04-29 19 views
17

Tôi đang cố gắng tìm kiếm tất cả các lần xuất hiện của "Tom" không được theo sau bởi "Ngón tay cái".Loại trừ RegExp, tìm kiếm một từ không theo sau bởi một số khác

tôi đã cố gắng tìm kiếm

Tom ^((?!Thumb).)*$ 

nhưng tôi vẫn nhận được đường phù hợp để Tom Thumb.

+1

Ngay cả trong một trường hợp đơn giản như thế này, nó luôn hữu ích khi có một số đầu vào mẫu và đầu ra dự kiến. ví dụ: bạn có muốn chỉ khớp 'Tom' hoặc 'Tom + mọi thứ cho đến cuối dòng' không? – alan

+0

Tôi sẽ cố gắng rõ ràng hơn. Tôi muốn tìm bất kỳ sự xuất hiện của "Tom" bất cứ nơi nào trong một dòng, nhưng tôi không muốn nhìn thấy bất kỳ dòng có chứa "Tom Thumb" – user1364539

Trả lời

25

Bạn không nói gì hương vị của regex bạn đang sử dụng, nhưng điều này sẽ làm việc nói chung:

Tom(?!\s+Thumb) 
+0

Đây là một tìm kiếm văn bản chạy trong diễn đàn phần mềm phpbb. – user1364539

+0

Vẫn nhận được chúng :-( – user1364539

+3

Bạn có ý nghĩa gì về việc 'vẫn nhận được chúng'? Regex này chắc chắn sẽ không khớp với 'Tom' theo sau là 'Thumb' (miễn là việc thực thi regex của bạn hỗ trợ lookaheads tiêu cực) .Vì vậy, tôi không chắc chắn những gì 'vẫn nhận được chúng' có nghĩa là gì. – alan

1

Tom(?!\s+Thumb) là những gì bạn tìm kiếm.

2

Trong trường hợp bạn không tìm kiếm toàn bộ từ, bạn có thể sử dụng regex sau:

Tom(?!.*Thumb) 

Xem this regex demo

Nếu bạn đang tìm kiếm toàn bộ từ (tức là toàn bộ từ Tom chỉ nên phù hợp nếu không có toàn bộ từ Thumb tiếp tục ở bên phải của nó), sử dụng

\bTom\b(?!.*\bThumb\b) 

Xem another regex demo

Lưu ý rằng:

  • \b - trận một hàng đầu/đuôi từ ranh giới
  • (?!.*Thumb) - là một tiêu cực lookahead thất bại của trận đấu nếu có bất kỳ ký tự 0+ (tùy thuộc vào động cơ bao gồm/không bao gồm các ký hiệu linebreak) theo sau với Thumb.
Các vấn đề liên quan