Perl RegEx获取两个标签

时间:2015-09-25 08:26:36

标签: regex perl

我有一个与正则表达式相关的问题。我的元素为$str1 = <strong>average_speed_answer_good_high</strong> 我想要做的是在一个变量的变量"_good_high"和变量"average_speed_answer"$sub_str1(在本例中为"good_high")之前获取字符串{ {1}}。

此处$sub_str2是字符串中唯一的常量部分,其余部分可以更改。即使在"_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 中填空。

我将不胜感激任何帮助或提示。

5 个答案:

答案 0 :(得分:1)

您需要在结束强标记之前指定_good_high

if ( $str1 =~ m{(<strong>)(.*?)_good_high.*?(</strong>)} ) {
    $sub_str1 = $2; 
}

if ( $str1 =~ m{<strong>(.*?)_good_high.*?</strong>} ) {
    $sub_str1 = $1; 
}

答案 1 :(得分:1)

怎么样:

@objc class StringFormat: NSObject {
    class func format(key: String, args: [AnyObject]) -> String {
        let locArgs: [CVarArgType] = args.map({ (arg: AnyObject) -> CVarArgType in
            if let iArg = (arg is NSNumber ? arg.intValue : nil) {
                return iArg
            }
            return arg as! CVarArgType
        });
        return String(format: key, arguments: locArgs)
    }
}

答案 2 :(得分:1)

不要太依赖正则表达式和捕获组。它们并不是您框中唯一的工具。

例如:

#!/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以获得答案。

答案 3 :(得分:0)

您的问题似乎是由于您了解()?.*.*的运作情况而导致的。

在你的第二部分示例中,没有变量部分,只有分组,有时没有捕获。

  • pre(.*)post导致pre
  • post$1之间的捕获
  • pre(?:a|b|c)post会导致分组替代方案而不会捕获
  • a(.*?)b导致非贪婪匹配(+捕获):匹配 x 而非 xby axbyb

答案 4 :(得分:0)

我认为最好的方法如下。只需查找除<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