如何使用Perl在最后一组括号中提取子字符串?

时间:2009-10-14 15:45:30

标签: regex perl

我使用Perl来解析字符串中的大小。我可以使用什么样的正则表达式来完成这个:

示例数据:      Sleepwell床垫(双床)
     Magic Nite(无翻盖设计)床垫(Full XL)

结果:      双胞胎      全XL

我知道我需要从字符串的末尾开始并解析第一组括号,但不知道该怎么做。

#!/usr/bin/perl

$file = 'input.csv';

open (F, $file) || die ("Could not open $file!");

while ($line = <F>)
{
  ($field1,$field2,$field3,$field4,$field5,$field6,$field7, $field8, $field9) = split ',', $line;
  if ( $field1 =~ /^.*\((.*)\)/ ) {
  print $1;
}


#print "$field1,$field2,$field3,$field4,$field5,$field6,$field7, $field8, $field9, $1\n";
}

close (F);

没有得到任何结果。也许我做得不对。

5 个答案:

答案 0 :(得分:5)

答案取决于您要查找的大小信息是否始终显示在字符串末尾的括号内。如果是这种情况,那么您的任务很简单:

#!/usr/bin/perl

use strict;
use warnings;

while (<DATA> ) {
    last unless /\S/;
    my ($size) = /\( ( [^)]+ ) \)$/x;
    print "$size\n";
}

__DATA__
Sleepwell Mattress (Twin)
Magic Nite (Flip Free design) Mattress (Full XL)

输出:

C:\Temp> xxl
Twin
Full XL

请注意,您发布的代码可以更好地写为:

#!/usr/bin/perl

use strict;
use warnings;

my ($input_file) = @ARGV;

open my $input, '<', $input_file
    or die "Could not open '$input_file': $!";

while (my $line = <$input>) {
    chomp $line;
    my @fields = split /,/, $line;
    if ($field[0] =~ /\( ( [^)]+ ) \)$/x ) {
        print $1;
    }
    print join('|', @fields), "\n";
}

close $input;

此外,您应该考虑使用Text::xSVText::CSV_XS来处理CSV文件。

答案 1 :(得分:2)

以下正则表达式将匹配字符串末尾的内容:

m/\(([^)]+)\)$/m

当时的m匹配​​mutli-line字符串,并将$更改为该行的末尾匹配,而不是字符串的结尾。

[编辑添加有关多行字符串的位]

答案 2 :(得分:0)

假设您的数据逐行到达,并且您只对最后一组parens的内容感兴趣:

if ( $string =~ /^.*\((.*)\)/ ) {
  print $1;
}

答案 3 :(得分:0)

这里并不需要花哨的正则表达式。让自己更容易。你可以拆分“[space](”并获取最后一个元素。当然,这是你想要得到的数据总是在最后......并且有括号

while(<>){
    @a = split / \(/, $_;
    print $a[-1]; # get the last element. do your own trimming
}

答案 4 :(得分:-1)

这是Perl5中表达的答案:

my $str = "Magic Nite (Flip Free design) Mattress (Full XL)";
$str =~ m/.*\((.*)\)/;
print "$1\r\n";