使用this link,我可以使用正则表达式(?!dalvikvm\b)\b\w+
创建一个过滤器,以过滤带有dalvikvm
标签的消息,但是我尝试了regex的多种变体,例如(?!dalvikvm-heap\b)\b\w+
,(?!dalvikvm\\-heap\b)\b\w+
,(?!dalvikvm[-]heap\b)\b\w+
以及许多其他变体,但我似乎无法理解摆脱dalvikvm-heap
消息。理想情况下,我想同时过滤掉它们,但是我也没有弄清楚那部分。
任何帮助,将不胜感激。
最佳答案
请在标签字段中使用^(?!dalvikvm)
。这将仅显示其标签不是以“dalvikvm”开头的消息。
以下是有关其工作原理的说明;如果您不感兴趣,可以跳过它们。首先,您必须记住以下问题:“此字符串与正则表达式匹配吗?”的真正含义是:“此字符串中的正则表达式匹配的任何位置吗?”
关于(?!x)
否定断言的棘手事情是,它们匹配字符串的下一部分与x
不匹配的任何地方:但这对字符串“dalvikvm”中除开始处的每个位置都是正确的。您链接到的博客文章的末尾添加了一个\b
,以便该表达式仅在不仅仅位于“dalvikvm” 和是单词边界之前的位置匹配。但这仍然匹配,因为字符串的结尾是单词边界,并且其后没有“dalvikvm”。因此,博客文章在其后添加了\w+
,说在单词边界之后必须有更多的单词字符。
它确实适用于这种情况,但是制作正则表达式有点奇怪,并且评估起来相对昂贵。并且您已经注意到,您无法将其调整为(?!dalvikvm-heap\b)\b\w+
。 “-”是一个非单词字符,因此紧随其后的是单词边界,其后是单词字符,而不是“dalvikvm-heap”,因此正则表达式在该点匹配。
相反,我使用^
,它仅在字符串的开头与否定断言匹配。总体而言,正则表达式仅在字符串的开头匹配,并且只有在字符串的开头没有后跟“dalvikvm”时才匹配。这意味着它将与“dalvikvm”或“dalvikvm-heap”不匹配。它的评估成本也较低,因为正则表达式引擎知道它只能在开始时匹配。
以这种方式制作正则表达式,只需将它们放在一起就可以过滤出多个标签。例如,^(?!dalvikvm)(?!IInputConnectionWrapper)
将过滤掉以“dalvikvm”或“IInputConnectionWrapper”开头的标签,因为字符串的开头不必紧跟第一个,也不应该紧跟第二个。
顺便说一句,谢谢您的链接。我没有意识到您可以使用logcat过滤器,因此如果没有它,我将无法提出我的答案。