簡體   English   中英

Perl RegEx獲取兩個標簽之間的字的子字符串

[英]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'
        ];

然后將它再次粘在一起,保留元素02以獲得答案。

您的問題似乎是由於您對()的運作有所了解而產生的? .*.*

在您的第二部分示例中,沒有可變部分,只有分組,有時沒有捕獲。

  • pre(.*)post導致在$1 prepost 捕獲所有內容
  • pre(?:a|b|c)post會導致備選方案的分組而不會被捕獲
  • a(.*?)b使非貪婪匹配 (+捕獲):匹配x代替xbyaxbyb

我認為最好的方法如下。 只需查找除了尖括號之外的所有文本,前面帶有<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM