Biểu thức chính quy cho một chuỗi chứa một từ nhưng không chứa từ khác


103

Tôi đang thiết lập một số mục tiêu trong Google Analytics và có thể sử dụng một chút trợ giúp regex.

Giả sử tôi có 4 URL

http://www.anydotcom.com/test/search.cfm?metric=blah&selector=size&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah2&selector=style&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah3&selector=size&value=1
http://www.anydotcom.com/test/details.cfm?metric=blah&selector=size&value=1

Tôi muốn tạo một biểu thức sẽ xác định bất kỳ URL nào có chứa string selector = size nhưng KHÔNG chứa detail.cfm

Tôi biết rằng để tìm một chuỗi KHÔNG chứa một chuỗi khác, tôi có thể sử dụng biểu thức này:

(^((?!details.cfm).)*$)

Tuy nhiên, tôi không chắc làm thế nào để thêm vào phần selector = size .

Mọi sự trợ giúp sẽ rất được trân trọng!

Câu trả lời:


144

Điều này nên làm điều đó:

^(?!.*details\.cfm).*selector=size.*$

^.*selector=size.*$phải đủ rõ ràng. Bit đầu tiên, (?!.*details.cfm)là một cái nhìn về phía trước phủ định: trước khi khớp với chuỗi, nó sẽ kiểm tra chuỗi không chứa "details.cfm" (với bất kỳ số ký tự nào trước nó).


8
FYI, hãy xem regexr.com để biết một cách hay để kiểm tra các biểu thức này.
Joshua Pinter

Luôn quên lookahead tiêu cực và nó rất hữu ích
Alexei xanh

"http://www.anydotcom.com/test/search.cfm?metric=blah&selector=sized&value=1" =~ /^(?!.*details\.cfm).*selector=size.*$/ #=> 0là không chính xác. (Lưu ý chuỗi có chứa "...selector=sized...".) Ngoài ra, tại sao .*$ở cuối?
Cary Swoveland

4

regex có thể là (cú pháp perl):

`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`

Đây là một regex bị hỏng, dấu ngoặc vuông biến tất cả các chuỗi mẫu thành sự kết hợp của các ký tự riêng lẻ.
Wiktor Stribiżew

2
^(?=.*selector=size)(?:(?!details\.cfm).)+$

Nếu công cụ regex của bạn hỗ trợ bộ định lượng posessive (mặc dù tôi nghi ngờ Google Analytics không hỗ trợ), thì tôi đoán điều này sẽ hoạt động tốt hơn cho các bộ đầu vào lớn:

^[^?]*+(?<!details\.cfm).*?selector=size.*$

Giả định selector=sizenày luôn luôn có trước details.cfmđó, điều này không đúng trong url cuối cùng.
Kobi

Chỉ để làm rõ điều này, đó không phải là tôi. Tôi không thể hiểu tại sao ai đó lại bỏ phiếu cho hai câu trả lời ở đây, cả hai đều đúng.
Kobi

@Kobi: Điều này lẽ ra phải là một cái nhìn trước, đã được sửa chữa. Ồ và nhân tiện, tôi không nghi ngờ đó là phiếu bầu của bạn.
Tomalak

0

Tôi đang tìm cách để tránh --line-bufferedở phía sau trong một tình huống tương tự vì giải pháp của OP và Kobi phù hợp với tôi. Trong trường hợp của tôi, loại trừ các dòng có "bot" hoặc "spider" trong khi bao gồm ' / '(đối với tài liệu gốc của tôi).

Lệnh ban đầu của tôi:

tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep ' / '

Bây giờ trở thành (với -Pcông tắc perl):

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'
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.