我有一个文件,其中包含以下行:
analogy of dinner, 12312-12351, http://wwwdinner.com
有时这些行是这样的:
eggs,bread,bacon:breakfast, 12312-1565A, http://wwwdinner.com
我想用逗号或其他东西将字符串分成 3 部分,但有时前面部分有逗号,所以我不知道如何。
我只需要前半部分和后半部分。我不需要中间部分,即数字部分;但有时那里也有字母。
你可以在这里使用拆分:
split /, /,$_; #split for every (<comma><space>)comma followed by a space
例如:
> echo "eggs,bread,bacon:breakfast, 12312-1565A, http://wwwdinner.com"|perl -lne '@a=split /, /;print $a[0]'
eggs,bread,bacon:breakfast
您可以先使用拆分。
my @p=split/,/ ;
然后将前几个部分连接在一起
$first=join(",",@p[0..scalar(@p)-3]);
$second=$p[-2];
$third=$p[-1];
如果不了解数据的全部可能性,就很难判断什么是最佳选择。但似乎最好关注中间的、不需要的字段,我认为应该是由连字符连接的两个数字或大写字母序列。那正确吗?
然后你可以使用一个简单的正则表达式来解析这些行,就像这样
use strict;
use warnings;
while (<DATA>) {
if (my @parts = /^(.+),\s*([0-9A-Z]+-[0-9A-Z]+),\s*(.+)$/) {
printf "%s ~ %s\n", @parts[0,2];
}
}
__DATA__
analogy of dinner, 12312-12351, http://wwwdinner.com
eggs,bread,bacon:breakfast, 12312-1565A, http://wwwdinner.com
输出
analogy of dinner ~ http://wwwdinner.com
eggs,bread,bacon:breakfast ~ http://wwwdinner.com
一种方法是使用正则表达式并将其锚定到一致的字符串的某些部分。
例如,要转换为管道“|” 分开:
$ perl -pe 's/(.*), ([0-9]*-[0-9]*), (.*)/$1|$2|$3/' < f
analogy of dinner|12312-12351|http://wwwdinner.com
eggs,bread,bacon:breakfast|12312-12351|http://wwwdinner.com
其中 [0-9] -[0-9]匹配任何一系列数字,它们之间带有破折号。例如,23-123213、9-1234 和 123123213-4 都将匹配。将表达式放在 () 中“记忆”它们,以后可以通过数字引用它们:$1 = 第一个记忆字段,$2 = 第二个,等等。
http://codeidol.com/perl/effective-perl/Regular-Expressions/Use-regular-expression-memory./
第一个模式 "(.*)," 匹配最后一个 "," 而不是第一个的原因是因为 perl 正则表达式默认是“贪婪的”——它们尽可能地匹配。
http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#Greedy
为了娱乐,
my @fields = reverse map "".reverse, split /\s*,/, reverse($_), 3;
严重地,
my @fields = /^(.*),\s*(\S+),\s*(\S+)\z/;
您可以使用split /([^:]*:)?([^,]*),([^,]*),(.*)/g, $str
.
这里有几个例子:
my $str = "eggs,bread,bacon:breakfast, 12312-1565A, http://wwwdinner.com";
my @parts = split /([^:]*:)?([^,]*),([^,]*),(.*)/g, $str;
print $parts[1]; #eggs,bread,bacon:
print $parts[2]; #breakfast
print $parts[3]; # 12312-1565A
print $parts[4]; # http://wwwdinner.com"
如果您分别使用第一个字符串:
my $str1 = "analogy of dinner, 12312-12351, http://wwwdinner.com";
my @parts = split /([^:]*:)?([^,]*),([^,]*),(.*)/g, $str1;
print $parts[2]; #analogy of dinner
print $parts[3]; # 12312-1565A
print $parts[4]; # http://wwwdinner.com"