Perl用正则表达式解析文本文件

Perl用正则表达式解析文本文件,perl,Perl,我有一个具有以下随机结构的文件: USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="AAA" FORMAT="ascii" TEXT="L2" 改变 (.*?) 到 改变 (.*?) 到 管道(|)是正则表达式中的一个特殊字符。退出它,比如:\\124;,它就会工作 if($Record =~ /USMS (.*?)\|<REQ MSISDN="(.*?)" CONTRA

我有一个具有以下随机结构的文件:

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

(.*?) 

改变

(.*?) 

管道(
|
)是正则表达式中的一个特殊字符。退出它,比如:
\\124;
,它就会工作

if($Record =~ /USMS (.*?)\|<REQ MSISDN="(.*?)" CONTRACT="(.*?)" SUBSCRIPTION="(.*?)" FORMAT="(.*?)" THRESHOLDID="(.*?)" TEXT="(.*?)"/)
如果($Record=~/USMS(.*?\\\管道(
)是正则表达式中的特殊字符。请将其转义,如:
\\
,它将起作用

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

如果($Record=~/USMS(.*?)\|不使用单个正则表达式,我将首先将数据拆分为单独的部分,然后分别处理它们

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;
}

my($usms\u part,$request)=split/\s*\\\124;我不使用单个正则表达式,而是先将数据拆分为单独的部分,然后分别处理它们

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;
}

my($usms\u part,$request)=split/\s*\\124;看起来您只需要包含在双引号中的字段

看起来像这样

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"

看起来您只需要包含在双引号中的字段

看起来像这样

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"

这会给他
1362224754632;;
而不仅仅是
,但不会解决未更换管道的问题。不过,总体而言,这仍然是一个好建议。这会给他
1362224754632;;
而不仅仅是
,但不会解决未更换管道的问题。不过,总的来说,这仍然是一个好建议。谢谢,它解决了这个问题。谢谢,它解决了这个问题。@Schwern-我找到了你的答案。如果数据文件中的任何键被更改,原始正则表达式将失败-这包括:键的顺序、键的拼写和键的计数。最好有一个更开放的(或通用的?)捕获键/值对,以考虑将来的更改。并将其存储在索引哈希中,这是一个很好的添加。尽管我会对第一级键使用某种形式的“记录编号”:“$request{$rnum}{$1}”=$2;'我也会采用这种方法。@Schwern-我已经给出了你的答案。如果数据文件中的任何键被更改,原始正则表达式将失败-这包括:键的顺序、键的拼写和键的计数。最好有一个更开放的(或通用的?)捕获键/值对,以考虑将来的更改。并将其存储在索引哈希中,这是一个很好的添加。尽管我会对第一级键使用某种形式的“记录编号”:“$request{$rnum}{$1}=$2;”我也会采用这种方法。
00966590832186;580;AAA;ascii;L2
00966590832186;580;BBB;1;ascii;L2