2013-01-31 14 views
22

Sử dụng this link tôi đã có thể tạo ra một bộ lọc bằng cách sử dụng regex (?!dalvikvm\b)\b\w+ để lọc ra các thông điệp với thẻ dalvikvm, nhưng tôi đã thử một số biến thể của regex như (?!dalvikvm-heap\b)\b\w+, (?!dalvikvm\\-heap\b)\b\w+, (?!dalvikvm[-]heap\b)\b\w+ và nhiều người khác và tôi dường như không thể loại bỏ các thông báo dalvikvm-heap. Lý tưởng nhất là tôi muốn lọc cả hai, nhưng tôi đã không tìm ra một phần nào.regex gì có thể được sử dụng để lọc ra các thông điệp dalvikvm VÀ dalvikvm-đống từ logcat

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

49

Sử dụng ^(?!dalvikvm) trong trường thẻ thay thế. Điều đó sẽ chỉ hiển thị các thư có thẻ không bắt đầu bằng "dalvikvm".

Dưới đây là các lưu ý về cách hoạt động của tính năng này; bạn có thể bỏ qua chúng nếu bạn không quan tâm. Để bắt đầu, bạn phải nhớ rằng câu hỏi, "Chuỗi này có khớp với regex không?" thực sự có nghĩa là, "Có vị trí nào trong chuỗi nơi regex khớp không?"

Điều phức tạp về số (?!x) xác nhận tiêu cực là chúng khớp với bất kỳ nơi nào phần tiếp theo của chuỗi không khớp với x: nhưng điều đó đúng với mọi vị trí trong chuỗi "dalvikvm" ngoại trừ bắt đầu. Bài đăng trên blog mà bạn đã liên kết để thêm \b vào cuối để biểu thức chỉ khớp ở một địa điểm không phải trước khi "dalvikvm" là một ranh giới từ. Nhưng điều này vẫn sẽ phù hợp, bởi vì kết thúc của chuỗi là một ranh giới từ, và nó không có "dalvikvm" sau nó. Vì vậy, bài đăng trên blog thêm \w+ sau nó, để nói rằng sau khi ranh giới từ phải có nhiều ký tự từ hơn.

Nó hoạt động đúng trong trường hợp đó, nhưng đó là một cách kỳ lạ để tạo ra một regex và nó tương đối đắt để đánh giá. Và như bạn đã nhận thấy, bạn không thể điều chỉnh nó thành (?!dalvikvm-heap\b)\b\w+. "-" là một ký tự không phải từ, vì vậy ngay lập tức sau đó, có một ranh giới từ, tiếp theo là ký tự từ, và không theo sau là "dalvikvm-heap", do đó, các regex phù hợp tại thời điểm đó.

Thay vào đó, tôi sử dụng ^, chỉ khớp ở đầu chuỗi, cùng với xác nhận phủ định. Nhìn chung, regex chỉ phù hợp ở đầu chuỗi, và chỉ sau đó nếu bắt đầu chuỗi không được theo sau bởi "dalvikvm". Điều đó có nghĩa là nó sẽ không khớp với "dalvikvm" hoặc "dalvikvm-heap". Nó cũng rẻ hơn để đánh giá, bởi vì động cơ regex biết nó chỉ có thể khớp lúc đầu.

Đặt regex theo cách này, bạn có thể lọc ra nhiều thẻ bằng cách chỉ cần ghép chúng lại với nhau. Ví dụ: ^(?!dalvikvm)(?!IInputConnectionWrapper) sẽ lọc ra các thẻ bắt đầu bằng "dalvikvm" hoặc "IInputConnectionWrapper", bởi vì đầu chuỗi không được theo sau bởi chuỗi đầu tiên và không được theo sau bởi chuỗi thứ hai.

BTW, cảm ơn liên kết của bạn. Tôi đã không nhận ra rằng bạn có thể sử dụng các bộ lọc logcat theo cách đó, vì vậy tôi sẽ không đưa ra câu trả lời của tôi mà không có nó.

+2

damn bạn rất tốt với Regex –

+1

Ngoài ra, bạn có thể đặt thẻ:^(?! dalvikvm) trong hộp Tìm kiếm của chế độ xem LogCat. –

+0

Và nếu bạn muốn siêu chính xác, bạn có thể sử dụng regex phân biệt chữ hoa chữ thường: (? -i)^(?! dalvikvm) –