Использование регулярных выражений в Perl для извлечения подстроки или строки из двоичного объекта текста.
У меня есть переменная с небольшим количеством текста в нем
$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 ответа
Ваше регулярное выражение должно быть:
/\/test.*\n/
Причина в том, что вы сопоставляете весь текст, и нет предела концу строки. Вам нужно будет указать, что вы хотите соответствие следующей новой строке. Это регулярное выражение включает новую строку в совпадении.
С помощью регулярных выражений есть разные способы сделать это, так что это зависит от контекста того, что вы пытаетесь достичь. Вы можете добавить m
модификатор в конце. Что это будет делать, так это рассматривать строку как несколько строк, чтобы вы могли затем использовать ^$
с каждой строкой вместо всего текста. Также используя m
модификатор multiline не приведет к совпадению, включающему перевод строки.
/\/test.*/m
было бы достаточно.
Для получения дополнительной информации: https://perldoc.perl.org/perlre.html
более того print "$foo";
Не будет печатать матч, потому что =~
Оператор возвращает значение true или false и не переназначает переменную для соответствия. Вам нужно изменить регулярное выражение для сопоставления с образцом и вывести первое совпадение:
$foo =~ /(\/test.*)/m;
print $1;
Измени свое выражение на
$foo =~ m~^\s*/test.*$~m;
Смотрите демо на regex101.com.
Это использует другие разделители (~
) так что вам не нужно избегать /
, дополнительно пробелы (\s*
) и включает multiline
Режим (m
).
ОП, кажется, хочет, чтобы печаталась указанная строка, а не весь текстовый блок. Для этого нам нужно изменить ответ Яна, чтобы получить и извлечь фактическое совпадение.
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