在perl中使用正则表达式匹配

时间:2014-07-22 07:04:35

标签: regex perl

我试图从perl中的文本文件中提取一些数据。我的文件看起来像这样

Name:John
FirstName:Smith
Name:Alice
FirstName:Meyers
....

我希望我的字符串看起来像John SmithAlice Meyers

我尝试过这样的事情,但是我被困住了,我不知道如何继续

 while (<INPUT>) {
        if (/^[Name]/) {
            $match =~ /(:)(.*?)(\n) / 
            $string = $string.$2;
        }
        if (/^[FirstName]/) {
            $match =~ /(:)(.*?)(\n)/ 
            $string = $string.$2;
        }

}

我尝试做的是,当我匹配Name或FirstName以复制到:\n之间的内容时,我感到困惑的是$1$2 < / p>

5 个答案:

答案 0 :(得分:1)

这会将你的名字和名字放在哈希中:

use strict;
use warnings;
use Data::Dumper;

open my $in, '<', 'in.txt';
my (%data, $names, $firstname);

while(<$in>){
    chomp;
    ($names) = /Name:(.*)/ if /^Name/; 
    ($firstname) = /FirstName:(.*)/ if /^FirstName/;
    $data{$names} = $firstname;
}

print Dumper \%data;

答案 1 :(得分:0)

通过perl one-liner,

$ perl -0777 -pe 's/(?m).*?Name:([^\n]*)\nFirstName:([^\n]*).*/\1 \2/g' file
John Smith
Alice Meyers

答案 2 :(得分:0)

while (<INPUT>) {
   /^([A-Za-z])+\:\s*(.*)$/;
   if ($1 eq 'Name') {
      $surname = $2;
   } elsif ($1 eq 'FirstName') {
      $completeName = $2 . " " . $surname;
   } else {
      /* Error */
   }
}

您可能想要添加一些错误处理,例如确保Name始终后跟FirstName,依此类推。

答案 3 :(得分:0)

$ 1 $ 2 $ 3 .. $ N,这是正则表达式中()的捕获结果。

如果你这样做,你就不能避免使用类似$ 1的变量。

my ($matched1,$matched2) = $text =~ /(.*):(.*)/

my $names = [];
my $name = '';
while(my $row = <>){
  $row =~ /:(.*)/;
  $name = $name.' '.$1;
  push(@$names,$name) if $name =~ / /;
  $name = '' if $name =~ / /;

}

`而(小于&GT;){

} `

答案 4 :(得分:-1)

open (FH,'abc.txt');
my(%hash,@array);
map{$_=~s/.*?://g;chomp($_);push(@array,$_)} <FH>;
%hash=@array;
print Dumper \%hash;