如何在perl中做正则表达式模式匹配表达式

时间:2015-08-17 12:45:16

标签: perl

我正在从文件中读取行:

CUSTEVSUMMROW_GPRS_SIMPLE GPRS - Intl Roaming - Mexico - Simple All In Plan (Monthly)|12920|MB|7750|1000|(243)

我使用以下逻辑

$line=~m/^(CUSTEVSUMMROW_GPRS).*?\s(.*?)\|.*\|(.*?)\s

我可以单独提取数据,如下所示

print"
Tag:CUSTEVSUMMROW_GPRS,
amt:1000,
lineTxt:GPRS - Intl Roaming - Mexico - Simple All In Plan (Monthly)\n";

如何提取另一个名为$usage = 12920的项目?

1 个答案:

答案 0 :(得分:0)

如果您只想调整正则表达式,可以在里面添加另一个捕获组。我建议更具体一点,并使用\d代替.来匹配数字。

/^(CUSTEVSUMMROW_GPRS).*?\s(.*?)\|(\d+)\|.*\|(.*?)\s/

12920将以$3结束,而(243)现在将为$4

请注意,您实际上并未从示例数据中捕获CUSTEVSUMMROW_GPRS_SIMPLE_SIMPLE丢失了。您也没有在括号(243)中输出数字。将代码复制到问题中时是否犯了错误?

然而,使用split可能更好。如果数据在每一行中具有相同的格式,则可能如下所示。当然,我必须在这里做一些猜测,因为这个问题相当有点。

use strict;
use warnings;
use feature 'say';

while (my $line = <DATA>) {
  chomp $line;
  my ($first_part, @details) = split /\|/, $line;
  my ($tag, $line_txt) = split /\s/, $first_part, 2;

  say "Tag: $tag";
  say "amt: $details[3]";
  say "lineTxt: $line_txt";
  say "usage: $details[0]";
}

__DATA__
CUSTEVSUMMROW_GPRS_SIMPLE GPRS - Intl Roaming - Mexico - Simple All In Plan (Monthly)|12920|MB|7750|1000|(243)