regex cho phù hợp với một cái gì đó nếu nó không đi trước một cái gì đó khác


163

Vì vậy, với regex trong java, tôi muốn viết một regex sẽ khớp với nếu và chỉ khi mẫu không được đi trước bởi các ký tự nhất định. Ví dụ:

String s = "foobar barbar beachbar crowbar bar ";

Tôi muốn khớp nếu thanh không có trước foo. Vì vậy, đầu ra sẽ là:

barbar
beachbar
crowbar
bar

Tôi biết đây có lẽ là một câu hỏi rất đơn giản. Tôi đang cố gắng học regex, nhưng trong lúc này tôi cần một cái gì đó để làm việc bây giờ.

Câu trả lời:


276

Bạn muốn sử dụng negative lookbehindnhư thế này:

\w*(?<!foo)bar

Trong đó (?<!x)có nghĩa là "chỉ khi nó không có" x "trước thời điểm này".

Xem Biểu thức chính quy - Nhìn để biết thêm thông tin.

Chỉnh sửa : đã thêm \w*để chụp các ký tự trước (ví dụ: "bãi biển").


2
Những sửa đổi nào cần được thực hiện để không khớp với foo_arbitrary_bar? tức là foo không ngay trước thanh
Brad Kent

1
@BradKent (?<!foo).*barsẽ phù hợp với một cái gì đó như thế, tôi tin.
emyller

@emyller không. cái đó sẽ khớp với foobazbar (foo không đến trước foobazbar, vì vậy nó phù hợp)
Brad Kent

2
@BradKent Tôi không đọc "không" trong "không khớp" của bạn, đó là lý do tại sao tôi nói nó sẽ khớp. Trường hợp của bạn trông giống như một \b(?!foo)\w*bar\btôi sau đó.
emyller

4
@BradKent Sau đó, bạn có thể hỏi một câu hỏi mới, giải thích chi tiết những gì bạn đang cố gắng đạt được hoặc tiếp tục chơi với các biểu thức thông thường cho đến khi bạn tự tìm thấy nó. :)
emyller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.