gpt4 book ai didi

regex - 在 Perl 中选择性地拆分字符串

转载 作者:行者123 更新时间:2023-12-04 15:02:09 24 4
gpt4 key购买 nike

Perl 新手。

我需要解析如下所示的报告:

2012-05-29@emaillocalpart@emaildomain@customerid@errormessage@messageid

我用了:
my @fields = split(/@/, $line, 6);

大多数情况下它工作正常,但有时错误消息将包含一个电子邮件地址和该电子邮件上@ 符号之后的所有文本,直到字符串末尾以我的消息 ID 结尾。

我想检查@s 的数量并进行条件解析,但有更好的方法吗?

编辑:

所需的输出是一个字符串列表,错误消息包含其中的任何内容(包括偶尔的电子邮件地址)。

由于有其他应用程序使用相同的报告,我无法更改分隔符或转义输出。

报告中的示例行:
2012-05-29@joedoe@example.com@AB99-5@440 4.4.1 Some error occurred@XYZ35
2012-05-29@foobar@invalid.com@ZZ88-6@550 5.1.1 <foobar@invalid.com>... User Unknow@GGH93
2012-05-29@barfoo@invalid.com@YY88-0@550 5.1.1 barfoo@invalid.com no such user@GGH93

解析第 1 行后 @fields 的预期内容:
2012-05-29
joedoe
example.com
AB99-5
440 4.4.1 Some error occurred
XYZ35

在解析第 2 行之后:
2012-05-29
foobar
invalid.com
ZZ88-6
550 5.1.1 <foobar@invalid.com>... User Unknow
GGH93

最佳答案

如果 $teststr 包含,例如:'2012-05-29@emaillocalpart@emaildomain@customerid@error@me@ssage@messageid';

以下代码:

my @fields2=split('@',$teststr);
my @finalfields=@fields2[0 .. 3];
my $finalat=$#fields2-1;
my $errormessage=join('@',@fields2[4 .. $finalat]);
push(@finalfields,$errormessage);
push(@finalfields,$fields2[$#fields2]);

print Data::Dumper->Dump([@finalfields])."\n";

给出以下输出:
$VAR1 = '2012-05-29';
$VAR2 = 'emaillocalpart';
$VAR3 = 'emaildomain';
$VAR4 = 'customerid';
$VAR5 = 'error@me@ssage';
$VAR6 = 'messageid';

道歉 - 这是一个相当冗长的解决方案。您也可以在一个正则表达式中执行相同的操作:
$teststr=~/(.[^@]*)@(.[^@]*)@(.[^@]*)@(.[^@]*)@(.*)@(.[^@]*)/;
print "$1\n$2\n$3\n$4\n$5\n$6\n";

关于regex - 在 Perl 中选择性地拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10897859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com