Использование регулярных выражений в 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
Другие вопросы по тегам