Подтвердить что ты не робот

Какое регулярное выражение может использоваться для фильтрации сообщений dalvikvm и dalvikvm-heap из логарифма

Использование эта ссылка Мне удалось создать фильтр с помощью regex (?!dalvikvm\b)\b\w+ для фильтрации сообщений с тегом dalvikvm, но Я пробовал несколько вариантов регулярных выражений, таких как (?!dalvikvm-heap\b)\b\w+, (?!dalvikvm\\-heap\b)\b\w+, (?!dalvikvm[-]heap\b)\b\w+ и многие другие, и я не могу избавиться от сообщений dalvikvm-heap. В идеале я хотел бы отфильтровать их обоих, но я еще не понял, что часть тоже.

Любая помощь будет оценена по достоинству.

4b9b3361

Ответ 1

Вместо этого используйте ^(?!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 таким образом, поэтому я бы не придумал свой ответ без него.