1

次のランダムな構造のファイルがあります。

USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="AAA" FORMAT="ascii" TEXT="L2"

また

USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="BBB" THRESHOLDID="1" FORMAT="ascii" TEXT="L2"

私はそれをperlで解析して、次のような値を取得しようとしています。

1362224754632; 00966590832186; 580; AAA; L2

以下はコードです:

if($Record =~ /USMS (.*?)|<REQ MSISDN="(.*?)" CONTRACT="(.*?)" SUBSCRIPTION="(.*?)" FORMAT="(.*?)" THRESHOLDID="(.*?)" TEXT="(.*?)"/)
{
                              print LOGFILE "$1;$2;$3;$4;$5;$6;$7\n";
}
elsif($Record =~ /USMS (.*?)|<REQ MSISDN="(.*?)" CONTRACT="(.*?)" SUBSCRIPTION="(.*?)" FORMAT="(.*?)" TEXT="(.*?)"/)
{
                              print LOGFILE "$1;$2;$3;$4;$5;$6\n";
}

しかし、私はいつも得ています:

;;;;;
4

4 に答える 4

3

パイプ(|)は、正規表現の特殊文字です。のようにそれをエスケープします:\|そしてそれは動作します。

if($Record =~ /USMS (.*?)\|<REQ MSISDN="(.*?)" CONTRACT="(.*?)" SUBSCRIPTION="(.*?)" FORMAT="(.*?)" THRESHOLDID="(.*?)" TEXT="(.*?)"/)

elseブランチについても同じです。

于 2013-03-02T21:50:23.550 に答える
3

単一の正規表現を使用する代わりに、最初にデータを個別のセクションに分割してから、個別にアプローチします。

my($usms_part, $request) = split / \s* \|<REQ \s* /x, $Record;

my($usms_id) = $usms_part =~ /^USMS (\d+)$/;

my %request;
while( $request =~ /(\w+)="(.*?)"/g ) {
    $request{$1} = $2;
}

考えられるすべてのキーと値のペア、およびそれらの可能な順序をハードコーディングする必要はなく、1つのコードでそれらを一般的に解析できます。

于 2013-03-02T23:31:35.980 に答える
1

変化する

(.*?) 

([a-zA-Z0-9]*)
于 2013-03-02T21:46:52.457 に答える
0

必要なのは、二重引用符で囲まれたフィールドだけのようです。

こんな感じ

use strict;
use warnings;

while (<DATA>) {
  my @values = /"([^"]+)"/g;
  print join(';', @values), "\n";
}

__DATA__
USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="AAA" FORMAT="ascii" TEXT="L2"
USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="BBB" THRESHOLDID="1" FORMAT="ascii" TEXT="L2"

出力

00966590832186;580;AAA;ascii;L2
00966590832186;580;BBB;1;ascii;L2
于 2013-03-03T14:38:06.480 に答える