Perl регулярные выражения подкачки подходящих групп - PullRequest
2 голосов
/ 19 апреля 2019

Я придумал регулярное выражение, которое анализирует выходные данные команды GPG.

Регулярное выражение:

^pub\s+(\S+)\s+(\S+)\s+.*\s+.{0,32}(.*)\s+(.*)<(\S+)>

Соответствующий текст:

pub   dsa1024 2018-02-28 [SCA]
      0019003A003E5A22E2337044D955066111F63B00
uid           [ unknown] John Doe <jogn@doe.name>
sub   elg1024 2018-02-28 [E]

Токовый выход:

Group 1.    6-13    dsa1024
Group 2.    14-24   2018-02-28
Group 3.    69-77   11F63B00
Group 4.    78-112  uid           [ unknown] John Doe 
Group 5.    113-126 jogn@doe.name

Проблема:

Как поменять Группа 2 и Группа 3 , только с использованием регулярных выражений, поэтому Группа 2 будет иметь значение 11F63B00 и Группа 3 будет иметь значение 2018-02-28 .Кроме того, я также хотел бы избавиться от текста в квадратных скобках ( Группа 4 ), включая сами скобки.

Онлайн пример.

Ответы [ 2 ]

5 голосов
/ 19 апреля 2019

Захваченные строки возвращаются в том порядке, в котором они были найдены в шаблоне.

Можно изменить порядок, используя указатели.

/
   ^ pub \s+ (\S+) \s+ 
   (?=  \S+  \s+ .* \s+ .{0,32}(.*) \s+  .*  < \S+ > )
       (\S+) \s+ .* \s+ .{0,32} .*  \s+ (.*) <(\S+)>
/x

Если мы выражаем это в виде строк, мы получаем следующее:

/
   ^ pub \h++ (\S++) \h++       # Line 1 (part 1)
   (?= .*+ \n                   # Line 1 (part 2)
       \h*+ \S*(\S{8})          # Line 2
   )
   (\S++) .*+ \n                # Line 1 (part 2)
   .*+ \n                       # Line 2
   (.*\S) \s++ <([^<>\s]++)>    # Line 3
/x

(я также сделал так, чтобы неудачи совпадений не совпали по привычке.)

(\S{32} будет быстрее, чем \S*, если это приемлемо.)

(я также сделал так, чтобы у четвертого захвата не было завершающих пробелов.)


Тем не менее, гораздо лучшее решение - установить порядок после факта.

@captures = @captures[0,2,1,3,4];

или

@captures[1,2] = @captures[2,1];
0 голосов
/ 25 апреля 2019

если ваши данные в d файле

perl -ane 'if($F[1]==2) {$n=<>;@k=split /\s+/,$n;@j=split /\s+/;s/$j[3]/$k[3]/;$n=~s/$k[3]/$j[3]/;print "$_$n" } else {s/\[.*\].+//;print}' d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...