匹配Perl

时间:2015-12-02 05:40:30

标签: regex perl

我正在使用Perl编写脚本,需要从文本文件中提取一些信息。

这是我的代码看起来的样子 - 字符串值组成但代表所有可能的字符串变体。

my @alpha = ("abcdefgh(i) jklmno(pqrs3), uvwxyz", 
             "abcdefghi jklmn(opq1st), uvwxyz",
             "abcdefghi jklmn(o_q(1s3)), uvwxyz",
             "abcdef(gh)i jklmno(pq(1s3)), uvwxyz");

foreach my $line (@alpha){
    if ($line =~ /\((.*\(?.*\)?)\),/){
    print $1
    }
}

我试图捕捉最后一组括号之间的大文本(或英国英语使用者的括号) 请注意我正在使用" dot"运算符,因为我想匹配任何内容,文本,数字或其他特殊字符。

基本上我想打印出来:

pqrs3
opq1st
o_q(1s3)
pq(1s3)

但我一直在接受:

 (i) jklmno(pqrs3) <-- not ok
 opq1st <-- this is ok
 opq(1s3) <-- this is also ok
 gh)i jklmno(pq(1s3) <-- not ok

我做错了什么?或者甚至可以这样匹配?
任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

(\((?:[^()]|(?1))*\))(?!.*\()

您可以在此处使用recursive正则表达式。请参阅演示。

https://regex101.com/r/hE4jH0/21

答案 1 :(得分:2)

以下是给定字符串的方法:

use warnings;
use strict;

my @alpha = ("abcdefgh(i) jklmno(pqrs3), uvwxyz", 
             "abcdefghi jklmn(opq1st), uvwxyz",
             "abcdefghi jklmn(o_q(1s3)), uvwxyz",
             "abcdef(gh)i jklmno(pq(1s3)), uvwxyz");

foreach my $line (@alpha)
{
    if ( $line =~ m/.*\s+\w+\((.*)\),\s+\w+/ )
    {
        print $1, "\n";
    }
}

输出:

pqrs3
opq1st
o_q(1s3)
pq(1s3)