22

使用此链接,我能够使用正则表达式创建一个过滤器(?!dalvikvm\b)\b\w+来过滤带有标签的消息dalvikvm,但是我已经尝试了正则表达式的几种变体,例如(?!dalvikvm-heap\b)\b\w+, (?!dalvikvm\\-heap\b)\b\w+,(?!dalvikvm[-]heap\b)\b\w+和许多其他的,我似乎无法摆脱这些dalvikvm-heap消息. 理想情况下,我想过滤它们,但我还没有弄清楚那部分。

任何帮助,将不胜感激。

4

1 回答 1

49

改为在标签字段中使用^(?!dalvikvm)。这将只显示标签不以“dalvikvm”开头的消息。

以下是有关其工作原理的说明;如果您不感兴趣,可以跳过它们。首先,您必须记住这个问题,“这个字符串是否与正则表达式匹配?” 真正的意思是,“这个字符串中是否有正则表达式匹配的位置?”

否定断言的棘手之(?!x)处在于它们匹配字符串的下一部分不匹配x的任何地方:但字符串“dalvikvm”中的每个位置都是如此,除了开头。您链接到的博客文章\b在末尾添加了 a ,以便表达式仅在不只是在“dalvikvm”之前并且是单词边界的位置匹配。但这仍然会匹配,因为字符串的结尾是单词边界,并且后面没有“dalvikvm”。所以博文\w+在它后面加了一个,表示在词边界之后必须有更多的词字符。

它确实适用于这种情况,但是制作正则表达式的方式有点奇怪,而且评估起来相对昂贵。正如您所注意到的,您无法将其调整为(?!dalvikvm-heap\b)\b\w+. “-”是一个非单词字符,所以紧随其后是单词边界,后面是单词字符,而不是“dalvikvm-heap”,所以正则表达式在该点匹配。

相反,我使用^,它只匹配字符串的开头,以及否定断言。总体而言,正则表达式仅在字符串的开头匹配,并且只有在字符串的开头没有跟随“dalvikvm”时才匹配。这意味着它不会匹配“dalvikvm”或“dalvikvm-heap”。评估也更便宜,因为正则表达式引擎知道它只能在开始时匹配。

以这种方式制作正则表达式,您可以通过将它们放在一起来过滤掉多个标签。例如,^(?!dalvikvm)(?!IInputConnectionWrapper)将过滤掉以“dalvikvm”或“IInputConnectionWrapper”开头的标签,因为字符串的开头必须不跟第一个,也不能跟第二个。

BTW, thanks for your link. I didn't realise that you could use the logcat filters that way, so I wouldn't have come up with my answer without it.

于 2013-02-13T10:35:45.060 回答