什么正则表达式可用于从logcat过滤掉dalvikvm和dalvikvm-heap消息

时间:2013-01-31 16:16:43

标签: android regex eclipse logcat

使用this link我可以使用正则表达式(?!dalvikvm\b)\b\w+创建过滤器来过滤掉标记为dalvikvm的邮件,但我尝试了几种正则表达式的变体,例如{{ 1}},(?!dalvikvm-heap\b)\b\w+(?!dalvikvm\\-heap\b)\b\w+以及许多其他人,我似乎无法摆脱(?!dalvikvm[-]heap\b)\b\w+消息。理想情况下,我想过滤它们两者,但我还没有想出那部分。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:49)

请在代码字段中使用^(?!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过滤器,所以如果没有它我就不会想出答案。