Строка Perl удаляет ее часть после шаблона

#regex #perl

#регулярное выражение #perl

Вопрос:

У меня есть переменная my $html , и она содержит строковое значение. Я хочу вырезать ее после слова

 </SELECT>
  

Как я могу это сделать с помощью Perl?

Ответ №1:

 use warnings;
use strict;

my $html = '<SELECT>foo</SELECT> bar';
$html =~ s{(</SELECT>).*}{$1};
print "$htmln";

__END__

<SELECT>foo</SELECT>
  

Вам также следует рассмотреть возможность использования одного из многих анализаторов HTML в CPAN.

Ответ №2:

 $html =~ s#</SELECT>.*$#</SELECT>#;
  

Вероятно, вы можете написать это без </SELECT> присутствия в строке замены, но ИМХО это было бы менее читабельно.

Пожалуйста, обратите внимание, что s /// substitution может использовать другие символы помимо / в качестве разделителей, и в этом случае я решил использовать # , потому что ваше регулярное выражение содержит символ косой черты, который в противном случае пришлось бы экранировать, что делает регулярное выражение менее читаемым

Комментарии:

1. Если строка $html содержит несколько строк, то приведенное выше регулярное выражение будет соответствовать только </SELECT> , если оно находится в первой строке. Вам нужно добавить модификатор ‘s’, чтобы обрабатывать строку как одну строку. s#</SELECT>.*$#</SELECT>#s;

2. @Sam — Я не уверен, имел ли OP в виду независимость от строки или нет … если независимо от строки. вы действительно правы.

Ответ №3:

Не используйте регулярное выражение (электропилу), когда достаточно ножа (ищите фиксированную строку):

 my $html = 'use dom to work with </SELECT> html!';
my $cut  = '</SELECT>';
printf "|%s|n", substr( $html, index( $html, $cut )   length( $cut ) );
==>
| html!|
  

Ответ №4:

Если вы хотите получить текст, который стоит перед первым </SELECT> , вы могли бы использовать регулярное выражение, подобное этому:

 $html =~ /(.*?</SELECT>)/;
my $required_text = $1;
  

или за один шаг:

 my ($required_text) = $html =~ /(.*?</SELECT>)/;
  

Он использует нежадный модификатор ? , который, я думаю, то, что вам нужно.
Или, лучше, substr() подпрограмму, как сказано в предыдущем ответе.