Perl регулярное выражение для множественной группировки шаблонов и многострочных регулярных выражений - PullRequest
1 голос
/ 08 июня 2019

У меня есть входной текстовый файл, содержащий несколько строк в указанном формате.

JMOD_01 :: This is starting of grouping 2nd KFGJHFG RTIRT DFB SFJKF ERIEFF FJDKF OIOIISD SDJKD 
last line ______________ 5564 numerical digits.

This is second starting of grouping 2nd KFGJHFG RTIRT FSFJKF  
ERIEFF FJDKF OIOIISD SDJKD 
till this end ___________ 021542 some random digits.

Я пытаюсь прочитать этот файл и извлечь искомый шаблон группированием

Это ниже, что я пробовал.Я попытался сгруппировать первый матч, и он получился правильно.Проблема возникает при поиске второй группировки, поскольку она не учитывает элементы следующей строки.

open(IFH,'<',"file.txt");

while ($line = <IFH>) {
if ($line =~ /^\s*(\w+\_\d*.*)\s*::(.*)/s) {
print "$1\n";
print "$2\n";
}
}
close(IFH);

Ожидаемый результат:

print $ 1;# Это должно дать мне

JMOD_01
fdgh_6765_546/456

и когда выведите $ 2;# тогда это должно дать мне

"This is starting of grouping 2nd KFGJHFG RTIRT DFB SFJKF ERIEFF FJDKF OIOIISD SDJKD last line"

"This is second starting of grouping 2nd KFGJHFG RTIRT FSFJKF  
ERIEFF FJDKF OIOIISD SDJKD till this end"

и когда выведите $ 3;# тогда это должно дать

"5564 numerical digits"
"021542 some random digits"

Но фактический результат будет другим для 2-й группировки: print $ 2;# фактический вывод

"This is first starting of grouping 2nd KFGJHFG RTIRT DFB SFJKF"

"This is second starting of grouping 2nd KFGJHFG RTIRT FSFJKF"

1 Ответ

1 голос
/ 08 июня 2019

Если я правильно понимаю проблему, мы, вероятно, можем использовать два простых выражения и извлечь нужные нам данные, если это будет нормально:

([A-Z_0-9]+)\s+::\s+([\s\S]+)

Демонстрация 1

Тест

use strict;

my $str = 'JMOD_01 :: This is starting of grouping 2nd KFGJHFG RTIRT DFB SFJKF ERIEFF FJDKF OIOIISD SDJKD 
last line ______________ 5564 numerical digits.

This is second starting of grouping 2nd KFGJHFG RTIRT FSFJKF  
ERIEFF FJDKF OIOIISD SDJKD 
till this end ___________ 021542 some random digits.

';
my $regex = qr/([A-Z_0-9]+)\s+::\s+([\s\S]+)/mp;

if ( $str =~ /$regex/g ) {
  print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
  # print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
  # print "Capture Group 2 is $2 ... and so on\n";
}

# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}

и для извлечения наших цифр:

([0-9]+\snumerical digits|[0-9]+\ssome random digits)

Демонстрация 2

Тест

use strict;

my $str = 'JMOD_01 :: This is starting of grouping 2nd KFGJHFG RTIRT DFB SFJKF ERIEFF FJDKF OIOIISD SDJKD 
last line ______________ 5564 numerical digits.

This is second starting of grouping 2nd KFGJHFG RTIRT FSFJKF  
ERIEFF FJDKF OIOIISD SDJKD 
till this end ___________ 021542 some random digits.

';
my $regex = qr/([0-9]+\snumerical digits|[0-9]+\ssome random digits)/mp;

if ( $str =~ /$regex/g ) {
  print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
  # print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
  # print "Capture Group 2 is $2 ... and so on\n";
}

# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

...