使用正则表达式从括号组中查找结果

时间:2011-09-08 12:01:06

标签: regex

文字格式:

(Superships)    
Eirik Raude - olajkutató fúrósziget
(Eirik Raude - Oil Patch Explorer)
  1. 我需要正则表达式来匹配第一组括号之间的文本。结果:text1。
  2. 我需要正则表达式来匹配第一组括号和第二组括号之间的文本。结果:text2。
  3. 我需要正则表达式来匹配第二组括号之间的文本。结果:text3。

    • text1:Superships,代表英文名称,
    • text2:Eirik Raude - olajkutatófúrósziget,代表匈牙利语字幕,
    • text3:Eirik Raude - Oil Patch Explorer,代表英文字幕。
  4. 我需要perl脚本的正则表达式来匹配这个标题和副标题。示例脚本:

    ($anchor) = $tree->look_down(_tag=>"h1", class=>"blackbigtitle"); 
    if ($anchor) { 
        $elem = $anchor;  
        my ($engtitle, $engsubtitle,  $hunsubtitle @tmp); 
        while (($elem = $elem->right()) && 
                ((ref $elem) && ($elem->tag() ne "table"))) { 
            @tmp = get_all_text($elem); 
            push @lines, @tmp; 
            $line = join(' ', @tmp); 
            if (($engtitle) = $line =~ m/**regex need that return text1**/) { 
                push @{$prog->{q(title)}}, [$engtitle, 'en']; 
                t "english-title added: $engtitle"; 
            } 
            elsif (($engsubtitle) = $line =~ m/**regex need that return text3**/) { 
                push @{$prog->{q(sub-title)}}, [$subtitle, 'en']; 
                t "english_subtitle added: $engsubtitle"; 
            } 
            elsif (($hunsubtitle) = $line =~ m/**regex need that return text2**/) { 
                push @{$prog->{q(hun-subtitle)}}, [$hunsubtitle, 'hu']; 
                t "hungarinan_subtitle added: $hunsubtitle"; 
            } 
        } 
    }
    

2 个答案:

答案 0 :(得分:0)

考虑到您的评论,您可以执行以下操作:

if (($english_title) = $line =~ m/^\(([^)]+)\)$/)  {
    $found_english_title = 1;
    # do stuff
} elsif (($english-subtitle) = $line =~ m/^([^()]+)$/) {
    # do stuff
} elsif ($found_english_title && ($hungarian-title) = $line =~ m/^\(([^)]+)\)$/) {
    # do stuff
}

答案 1 :(得分:-1)

如果您需要在一个表达式中匹配它们:

\(([^)]+)\)([^(]+)\(([^)]+)\)

这匹配(,然后是任何不是),然后),然后任何不是(,然后,(,......我认为你得到了图片。

第一组将是text1,第二组将是text2,第三组将是text3。

当你多次应用时,你也可以创建一个更像generix的正则表达式,例如“(text1)”,“(text1)text2(text3)”或“text1(text2)”:

(?:^|[()])([^()])(?:[()]|$)

这匹配字符串或(或)的开头,然后匹配不是(或),然后(或)或字符串结尾的字符。 :?用于非捕获组,因此第一组将具有该字符串。每次匹配(和)都需要更复杂的东西,即它可以匹配“(text1(”。