2013-01-31 10 views
22

utilizzando this link sono stato in grado di creare un filtro utilizzando l'espressione regolare (?!dalvikvm\b)\b\w+ per filtrare i messaggi con il tag dalvikvm, ma ho provato diverse varianti del espressioni regolari come (?!dalvikvm-heap\b)\b\w+, (?!dalvikvm\\-heap\b)\b\w+, (?!dalvikvm[-]heap\b)\b\w+ e molti altri e non riesco a liberarmi dei messaggi dalvikvm-heap. Idealmente, mi piacerebbe filtrarli entrambi, ma non l'ho ancora capito.Che espressione regolare può essere usato per filtrare i messaggi dalvikvm E dalvikvm-heap dal logcat

Qualsiasi aiuto sarebbe apprezzato.

risposta

49

Utilizzare invece ^(?!dalvikvm) nel campo del tag. Questo mostrerà solo i messaggi il cui tag non inizia con "dalvikvm".

Quanto segue è una nota su come funziona; puoi saltarli se non sei interessato. Per iniziare, devi ricordare che la domanda "Questa stringa corrisponde alla regex?" significa davvero: "C'è qualche posizione in questa stringa in cui la regex corrisponde?"

La cosa complicata delle asserzioni negative (?!x) è che esse corrispondono ovunque la parte successiva della stringa non corrisponde a x: ma questo è vero per ogni punto della stringa "dalvikvm" tranne per l'inizio. Il post del blog che hai collegato aggiunge un \b alla fine in modo che l'espressione corrisponda solo a un posto che non è appena prima "dalvikvm" e è un limite di parole. Ma questo corrisponderebbe ancora, perché la fine della stringa è un limite di parole, e non ha "dalvikvm" dopo di esso. Quindi il post del blog aggiunge il \w+ dopo di esso, per dire che dopo il confine della parola ci devono essere più caratteri di parole.

Funziona esattamente per questo caso, ma è un modo un po 'strano di eseguire un'espressione regolare ed è relativamente costoso da valutare. E come hai notato, non puoi adattarlo a (?!dalvikvm-heap\b)\b\w+. "-" è un carattere non di parole, quindi immediatamente dopo, c'è un limite di parola, seguito da caratteri di parole, e non seguito da "dalvikvm-heap", quindi l'espressione regolare corrisponde a quel punto.

Invece, io uso ^, che corrisponde solo all'inizio della stringa, insieme all'asserzione negativa. Nel complesso, la regex corrisponde solo all'inizio della stringa, e solo se l'inizio della stringa non è seguito da "dalvikvm". Ciò significa che non corrisponderà "dalvikvm" o "dalvikvm-heap". È anche più economico da valutare, perché il motore regex sa che può solo corrispondere all'inizio.

Effettuando in questo modo l'espressione regolare, è possibile filtrare più tag semplicemente mettendoli insieme. Ad esempio, ^(?!dalvikvm)(?!IInputConnectionWrapper) filtrerà i tag che iniziano con "dalvikvm" o "IInputConnectionWrapper", perché l'inizio della stringa non deve essere seguito dal primo e non essere seguito dal secondo.

BTW, grazie per il link. Non mi rendevo conto che potevi usare i filtri logcat in quel modo, quindi non avrei avuto la mia risposta senza di essa.

+2

maledetto sei così bravo con Regex –

+1

In alternativa, puoi inserire tag:^(?! dalvikvm) nella casella di ricerca della vista LogCat. –

+0

E se si desidera essere super-corretti, è possibile utilizzare espressioni regolari con distinzione tra maiuscole e minuscole: (? -i)^(?! dalvikvm) –