求一个正规表达式写法(在线等)

这下方便了,谢谢


QUOTE:
原帖由 ynchnluiti 于 2008-12-25 14:41 发表
Text::CSV 可以。http://search.cpan.org/dist/Text-CSV/lib/Text/CSV.pm
#!/usr/bin/perl

use Text::CSV;
$csv = Text::CSV->new();

$line=q("abc"","",""bcd","","","123","","";

$status  = $cs ...

唉唉,没发现这个,我自己造了个车轮

#!/usr/bin/perl

use strict;
use warnings;

$_ = q{"abc"","",""bcd","","","123","",""};

my @source = split //, $_;
my @data;
my $flag = 0;
for (0 .. $#source) {
        if ($source[$_] eq '"') {
                if ($flag == 0) {
                        $flag = 1;
                        next;
                }
                if ($flag == 1) {
                        if (($_ == $#source) || ($source[$_+1] eq ',')){
                                $flag = 0;
                                next;
                        }
                        $flag += 1;
                        next;
                }
                $flag -= 1 if $flag == 2;               
        }
       
        if ($flag == 0 && (($source[$_] eq ',') || ($_ == $#source))) {
                print join '', @data, "\n";
                @data = ();
                $flag = 0;
                next;
        }
        push @data, $source[$_];
}


QUOTE:
原帖由 cobrawgl 于 2008-12-25 15:03 发表

唉唉,没发现这个,我自己造了个车轮

#!/usr/bin/perl

use strict;
use warnings;

$_ = q{"abc"","",""bcd","","","123","",""};

my @source = split //, $_;
my @data;
my $flag = 0 ...

有毅力
很感谢提供代码,不过有bug,
如$_ = q{"abc","123"};最后一个项目123没有输出来。我修改了一下,供大家参考:
#!/usr/bin/perl

use strict;
use warnings;

#$_ = q{"abcテスト"","",""bcd","","","123","",""};
$_ = q{"abc","123"};

my @columns = &parse($_);
foreach(@columns)
{
  print "--$_--\n";
}


sub parse
{
  my ($str) = @_;
  my @source = split //, $str;
  my (@data, @columns);
  my $flag = 0;
  for (0 .. $#source)
  {
    if ($source[$_] eq '"')
    {
      if ($flag == 0)
      {
        $flag = 1;
        next;
      }
      elsif ($flag == 1)
      {
        if($_ == $#source)
        {
          $flag = 0;
        }
        elsif ($source[$_+1] eq ',')
        {
          $flag = 0;
          next;
        }
        else
        {
          $flag += 1;
          next;
        }
      }
      $flag -= 1 if $flag == 2;
    }

    if ($flag == 0 && (($source[$_] eq ',') || ($_ == $#source)))
    {
      push @columns, join '', @data;
      @data = ();
      $flag = 0;
      next;
    }
    push @data, $source[$_];
  }

  return @columns;
}

[[i] 本帖最后由 HawaiiLeo 于 2008-12-25 17:15 编辑 [/i]]


QUOTE:
原帖由 HawaiiLeo 于 2008-12-25 17:03 发表
很感谢提供代码,不过有bug,
如$_ = q{"abc","123"};最后一个项目123没有输出来。我修改了一下,供大家参考:
#!/usr/bin/perl

use strict;
use warnings;

#$_ = q{"abcテスト"","",""bcd","","","12 ...

哦,没发现这个问题

其实只要在 for {} 后面加上 print join '', @data, "\n"; 就可以了,数据已经在里面了,只是没有打印