[英]Perl RegEx to get substring of word found between two tags
我有一個與正則表達式相關的問題。 我有一個元素$str1 = <strong>average_speed_answer_good_high</strong>
我要做的是在一個變量中的變量$sub_str1
中獲取"_good_high"
之前的字符串(在本例中為"average_speed_answer"
)變量$sub_str2
中的"good_high"
。
這里"_good_high"
是字符串中唯一不變的部分,其余部分可以改變。 即使在"_good_high"
, "</strong>"
之前也可能會出現一些字符。 我可以獲得一些關於如何做到這一點的提示嗎?
到現在為止,我能夠做到這樣的事情:
if ( $str1 =~ m{(<strong>)(.*?)(</strong>)} ) {
$sub_str1 = $2; #which gives average_speed_answer_good_high
}
我試過一些組合,比如
(<strong>)(?=_good_high)(</strong>)
(<strong>)(?<=_good_high)(</strong>)
(<strong>)((?<=_good_high)\w+)(</strong>) #tried $2 and $3
(<strong>)(?<=_good_high)\w+(</strong>)
(<strong>)((?<=(_good_high))\w+)(</strong>)#tried $2, $3 and $4
但他們都在$sub_str1
留空了。
我將不勝感激任何幫助或提示。
您需要在結束強標記之前指定_good_high
。
if ( $str1 =~ m{(<strong>)(.*?)_good_high.*?(</strong>)} ) {
$sub_str1 = $2;
}
要么
if ( $str1 =~ m{<strong>(.*?)_good_high.*?</strong>} ) {
$sub_str1 = $1;
}
怎么樣:
($sub_str1) = $str1 =~ m{<strong>(.*?)_good_high</strong>};
不要太依賴正則表達式和捕獲組。 它們不是你盒子里唯一的工具。
例如:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $str1 = '<strong>average_speed_answer_good_high</strong>';
if ( my ($sub_str1) = $str1 =~ m{<strong>(.*?)</strong>} ) {
print "Substr: $sub_str1\n";
my @split_str = split ( /_/, $sub_str1 );
print Dumper \@split_str;
print "Extracted: ",join ( "_", (split ( /_/, $sub_str1 ))[0..2] ),"\n";
}
我們像以前一樣提取子字符串 - 但之后我們使用_
分割它:
$VAR1 = [
'average',
'speed',
'answer',
'good',
'high'
];
然后將它再次粘在一起,保留元素0
到2
以獲得答案。
您的問題似乎是由於您對(
, )
的運作有所了解而產生的?
, .*
和.*
。
在您的第二部分示例中,沒有可變部分,只有分組,有時沒有捕獲。
pre(.*)post
導致在$1
pre
和post
捕獲所有內容 pre(?:a|b|c)post
會導致備選方案的分組而不會被捕獲 a(.*?)b
使非貪婪匹配 (+捕獲):匹配x
代替xby
在axbyb
我認為最好的方法如下。 只需查找除了尖括號之外的所有文本,前面帶有<strong>
標記(不需要搜索結束標記),然后是_good_high
。 那是想要的子串
use strict;
use warnings;
my $s = <<END;
<html>
<body>
<strong>average_speed_answer_good_high</strong>
</body>
</html>
END
if ( my ($text) = $s =~ /<strong>([^<>]+)_good_high/ ) {
print $text, "\n";
}
average_speed_answer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.