0

我有一个文件,其中包含以下行:

analogy of dinner, 12312-12351, http://wwwdinner.com

有时这些行是这样的:

eggs,bread,bacon:breakfast, 12312-1565A, http://wwwdinner.com

我想用逗号或其他东西将字符串分成 3 部分,但有时前面部分有逗号,所以我不知道如何。

我只需要前半部分和后半部分。我不需要中间部分,即数字部分;但有时那里也有字母。

4

6 回答 6

2

你可以在这里使用拆分:

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
于 2013-04-16T06:15:29.350 回答
1

您可以先使用拆分。

my @p=split/,/ ;

然后将前几个部分连接在一起

$first=join(",",@p[0..scalar(@p)-3]);
$second=$p[-2];
$third=$p[-1];
于 2013-04-16T06:04:56.490 回答
0

如果不了解数据的全部可能性,就很难判断什么是最佳选择。但似乎最好关注中间的、不需要的字段,我认为应该是由连字符连接的两个数字或大写字母序列。那正确吗?

然后你可以使用一个简单的正则表达式来解析这些行,就像这样

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
于 2013-04-16T06:40:18.410 回答
0

一种方法是使用正则表达式并将其锚定到一致的字符串的某些部分。

例如,要转换为管道“|” 分开:

$ 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

于 2013-04-16T06:24:12.283 回答
0

为了娱乐,

my @fields = reverse map "".reverse, split /\s*,/, reverse($_), 3;

严重地,

my @fields = /^(.*),\s*(\S+),\s*(\S+)\z/;
于 2013-04-16T07:12:56.863 回答
-1

您可以使用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"
于 2013-04-16T06:09:25.123 回答