2013-01-31 20 views
22

this link का उपयोग करते हुए मैं टैग dalvikvm के साथ संदेश को फ़िल्टर करने के लिए regex (?!dalvikvm\b)\b\w+ का उपयोग कर एक फिल्टर बनाने के लिए कर रहा था से dalvikvm और dalvikvm-ढेर संदेशों को फ़िल्टर करने के लिए किया जा सकता है, लेकिन मैं के कई रूप की कोशिश की है regex जैसे (?!dalvikvm-heap\b)\b\w+, (?!dalvikvm\\-heap\b)\b\w+, (?!dalvikvm[-]heap\b)\b\w+, और कई अन्य और मुझे dalvikvm-heap संदेशों से छुटकारा नहीं मिल रहा है। आदर्श रूप में मैं उन्हें दोनों को फ़िल्टर करना चाहता हूं, लेकिन मुझे अभी तक उस भाग को नहीं मिला है।क्या regex logcat

किसी भी मदद की सराहना की जाएगी।

उत्तर

49

टैग फ़ील्ड में ^(?!dalvikvm) का उपयोग करें। यह केवल उन संदेशों को दिखाएगा जिनके टैग "dalvikvm" से शुरू नहीं होते हैं।

नीचे यह काम करता है कि यह कैसे काम करता है; यदि आप रुचि नहीं रखते हैं तो आप उन्हें छोड़ सकते हैं। शुरू करने के लिए, आपको यह सवाल याद रखना होगा, "क्या यह स्ट्रिंग रेगेक्स से मेल खाती है?" वास्तव में इसका मतलब है, "क्या इस स्ट्रिंग में कोई स्थिति है जहां रेगेक्स मेल खाता है?"

(?!x) नकारात्मक अनुमानों के बारे में मुश्किल बात यह है कि स्ट्रिंग के अगले भाग x से मेल नहीं खाते हैं, लेकिन यह शुरुआत के अलावा "dalvikvm" स्ट्रिंग में हर जगह के बारे में सच है। आपके द्वारा लिंक किया गया ब्लॉग पोस्ट अंत में \b जोड़ता है ताकि अभिव्यक्ति केवल उस स्थान पर मेल खाती हो जो "dalvikvm" और से पहले नहीं है, एक शब्द सीमा है। लेकिन यह अभी भी मेल खाता है, क्योंकि स्ट्रिंग का अंत एक शब्द सीमा है, और इसके बाद इसमें "दल्विकविक" नहीं है। तो ब्लॉग पोस्ट \w+ इसके बाद कहता है कि शब्द सीमा के बाद और शब्द वर्ण होना चाहिए।

यह ठीक उसी मामले के लिए काम करता है, लेकिन यह रेगेक्स बनाने का एक अजीब तरीका है, और यह मूल्यांकन करने के लिए अपेक्षाकृत महंगा है। और जैसा कि आपने देखा है, आप इसे (?!dalvikvm-heap\b)\b\w+ पर अनुकूलित नहीं कर सकते हैं। "-" एक गैर-शब्द चरित्र है, इसलिए इसके तुरंत बाद, एक शब्द सीमा होती है, उसके बाद शब्द वर्ण होते हैं, और उसके बाद "दल्विकविक-हीप" नहीं होता है, इसलिए उस बिंदु पर रेगेक्स मेल खाता है।

इसके बजाय, मैं ^ का उपयोग करता हूं, जो केवल नकारात्मक दावे के साथ स्ट्रिंग की शुरुआत में मेल खाता है। कुल मिलाकर, रेगेक्स केवल स्ट्रिंग की शुरुआत में मेल खाता है, और तभी तभी स्ट्रिंग की शुरुआत "dalvikvm" के बाद नहीं होती है। इसका मतलब है कि यह "dalvikvm" या "dalvikvm-heap" से मेल नहीं खाएगा। मूल्यांकन करने के लिए यह भी सस्ता है, क्योंकि रेगेक्स इंजन जानता है कि यह संभवतः शुरुआत में ही मिल सकता है।

इस तरह से रेगेक्स बनाना, आप उन्हें एक साथ रखकर एकाधिक टैग फ़िल्टर कर सकते हैं। उदाहरण के लिए, ^(?!dalvikvm)(?!IInputConnectionWrapper) उन टैग को फ़िल्टर करेगा जो "dalvikvm" या "IInputConnectionWrapper" से शुरू होते हैं, क्योंकि स्ट्रिंग की शुरुआत पहले के बाद नहीं होती है और दूसरे के बाद नहीं होती है।

बीटीडब्ल्यू, आपके लिंक के लिए धन्यवाद। मुझे एहसास नहीं हुआ कि आप इस तरह से लॉगकैट फिल्टर का उपयोग कर सकते हैं, इसलिए मैं इसके बिना अपने उत्तर के साथ नहीं आया होता।

+2

अरे आप रेगेक्स –

+1

के साथ बहुत अच्छे हैं, वैकल्पिक रूप से, आप लॉगकैट व्यू के खोज बॉक्स में टैग:^(?! dalvikvm) डाल सकते हैं। –

+0

और यदि आप सुपर-सही होना चाहते हैं, तो आप केस-संवेदनशील रेगेक्स का उपयोग कर सकते हैं: (? -i)^(?! dalvikvm) –