Почему я не могу захватить более одной цифры в подстроке?
Я создаю регулярное выражение для извлечения различных полей из файлов журналов. Я создал одно регулярное выражение, используя некоторые инструменты, и оно почти завершено. единственное, что для одного поля - это извлечение только одной цифры вместо полного номера. для лучшего понимания я сохранил его по ссылке ниже.
Шаблон:
/(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew))^(?:).*(?P<ParNew_before_1>\d)K\->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size>\d+)K\), (?P<par_new_duration>\d+\.\d+) secs\] (?P<ParNew_before_2>\d+)K\->(?P<ParNew_after_2>\d+)K\((?P<total_heap_size>\d+)/
Строка:
146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080K), 0.0320299 secs] [Times: user=0.32 sys=0.01, real=0.03 secs]
Токовый выход:
Full match `146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080`
Group `ParNew_before_1` `3`
Group `ParNew_after_1` `88155`
Group `young_heap_size` `419456`
Group `par_new_duration` `0.0313803`
Group `ParNew_before_2` `9893391`
Group `ParNew_after_2` `9602913`
Group `total_heap_size` `12478080`
Ожидаемый результат:
Full match `146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080`
группа
ParNew_before_1
378633
Group `ParNew_after_1` `88155`
Group `young_heap_size` `419456`
Group `par_new_duration` `0.0313803`
Group `ParNew_before_2` `9893391`
Group `ParNew_after_2` `9602913`
Group `total_heap_size` `12478080`
В приведенном выше примере: группа ParNew_before_1
извлекая только одну цифру.
2 ответа
Здесь я хотел бы отметить три вещи:
- Lookahead должен быть размещен после
^
(имеет смысл проверять его шаблон только в начале строки) \d
не будет соответствовать более 1 цифры, добавить+
после этого, чтобы соответствовать 1 или более.*
слишком жадный, используйте ленивый.*?
,
использование
^(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew)).*?(?P<ParNew_before_1>\d+)K->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size>\d+)K\), (?P<par_new_duration>\d+\.\d+) secs\] (?P<ParNew_before_2>\d+)K\->(?P<ParNew_after_2>\d+)K\((?P<total_heap_size>\d+)
^^^ ^ ^ ^
Смотрите это регулярное выражение
Также вам не нужно убегать -
которые не находятся внутри классов персонажей.
Кроме того, когда у вас длинный шаблон, не стесняйтесь использовать модификатор x (для режима "свободного пробела") и, в конечном итоге, функцию цитирования \Q..\E
(чтобы проиллюстрировать пробелы и специальные символы без их экранирования), чтобы сделать его более читабельным:
/
^
(?=
[^PD\n]* (?>[PD][^\nPD]*)*? \b
(?: ParNew | PSYoungGen | DefNew )
)
[^\n\d]* (?>\d+[^\n\d]+)*? \b
(?<ParNew_before_1> \d+ ) K->
(?<ParNew_after_1> \d+ ) \QK(\E
(?<young_heap_size> \d+ ) \QK), \E
(?<par_new_duration> \d+\.\d+ ) \Q secs] \E
(?<ParNew_before_2> \d+ ) K->
(?<ParNew_after_2> \d+ ) \QK(\E
(?<total_heap_size> \d+ )
/x