Использование регулярных выражений в Perl для извлечения подстроки или строки из двоичного объекта текста - PullRequest
0 голосов
/ 23 мая 2018

У меня есть переменная с небольшим количеством текста в ней

$foo = "
    Garbage directory
    /test/this/is/a/directory
    /this/is/another/foo\nThisd is is\nDrop stuff testing\nRandom stuff emacs is great";

Как использовать регулярное выражение, чтобы получить строку, /test/this/is/a/directory

Я пробовал это:

my $foo = "
    Garbage directory
    /test/this/is/a/directory
    /this/is/another/foo\nThisd is is\nDrop stuff testing\nRandom stuff emacs is great";
$foo =~ /^\/test.*$/;
print "\n$foo\n";

Но это просто продолжает печатать весь текстовый блок.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Измените выражение на

$foo =~ m~^\s*/test.*$~m;

См. демо на regex101.com .


При этом используются другие разделители (~), чтобы вам не нужно было экранировать /, дополнительно пробелы (\s*) и включать режим multiline (m).

0 голосов
/ 23 мая 2018

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

my $foo = "
    Garbage directory
    /test/this/is/a/directory
    /this/is/another/foo\nThisd is is\nDrop stuff testing\nRandom stuff emacs is great";
$foo =~ m~^(\s*/test.*)$~m;
$foo = $1;
print "\n$foo\n"

Вывод:

/test/this/is/a/directory
0 голосов
/ 23 мая 2018

Ваше регулярное выражение должно быть:

/\/test.*\n/

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

С помощью регулярных выражений есть разные способы сделать это, так что это зависит от контекста того, что вы пытаетесь выполнить.Вы можете добавить модификатор m в конце.Это будет обрабатывать строку как несколько строк, поэтому вы можете использовать ^$ с каждой строкой вместо всего текста.Кроме того, использование многострочного модификатора m не приведет к совпадению, включающему новую строку.

/\/test.*/m будет достаточно.

Для получения дополнительной информации: https://perldoc.perl.org/perlre.html

Более того, print "$foo"; НЕ будет печатать совпадение, потому что оператор =~ возвращает значение true или false и не переназначает переменную для совпадения.Вам нужно изменить регулярное выражение для сопоставления с образцом и напечатать первое совпадение:

$foo =~ /(\/test.*)/m;
print $1;
...