Я пытаюсь получить имена потоков из файла дампов потоков. Имена потоков обычно содержатся в «двойных кавычках» в первой строке каждого дампа потока. Это может выглядеть просто следующим образом:Могу ли я улучшить производительность этого регулярного выражения далее
"THREAD1" daemon prio=10 tid=0x00007ff6a8007000 nid=0xd4b6 runnable [0x00007ff7f8aa0000]
Или же большой, как следует:
"[STANDBY] ExecuteThread: '43' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007ff71803a000 nid=0xd3e7 in Object.wait() [0x00007ff7f8ae1000]
Регулярное выражение, которое я написал просто один: "(.*)"
. Он захватывает все внутри двойных кавычек как группу. Однако это приводит к тяжелому возврату, что требует много шагов, как можно видеть here. Устно мы можем объяснить это регулярное выражение, как «захватить все, что заключена в двойные кавычки, как группа»
Так что я придумал другой регулярное выражение, которое выполняет то же самое: "([^\"])"
. Вербально мы можем описать это регулярное выражение как «захватить любое количество символов без двойной кавычки, которые заключены внутри двойных кавычек». Я не нашел никакого быстрого регулярного выражения, чем это. Он не выполняет никакого возврата и, следовательно, требует минимальных шагов, как можно видеть here.
Я сказал это выше моему коллеге. Он придумал еще один: "(.*?)"
. Я не понял, как это работает. Он выполняет значительно меньший откат, чем первый, но немного медленнее второго, как можно видеть here. Однако
- Я не понимаю, почему обратный путь останавливается раньше.
- Я понимаю, что
?
является квантификатором, что означает . Однако я не понимаю, как используется здесь. - На самом деле я не могу угадать, как мы можем описать это регулярное выражение в устной форме.
Мой коллега попытался объяснить мне, но я до сих пор не могу его полностью понять. Может ли кто-нибудь объяснить?
вы должны соответствовать подстроки, как ' "'+' подстроки, не имеющие quote' + '" 'Do? –
Я думаю, вы должны использовать '. *?', Что сделает поиск ленивым. Я думаю, что у вашего текущего регулярного выражения есть недостаток. Если в строке после имени потока есть «какой-то текст здесь», тогда будет отображаться последний '' '. – TheLostMind
@VinodMadyalkar: Вы предлагаете одно из наименее эффективных решений. У ленивого соответствия есть некоторые очень важные недостатки Вместо этого, вместо отрицательного символьного класса лучше использовать –