Perl正则表达式有多种可能性

时间:2015-04-10 11:17:46

标签: regex perl

想象一下,您有以下要解析的行:

2061;2014-XXX-10;12345;12345;2014-XXX-10;1;MACRO;ID;;3060;204;08;;;;;;1;;;
2061;YYY016582;2099130;11;1658-YYY 20;1;MACRO;ID;64543;;204;08;20010314;;20010314;60454;AA;1;;;
2061;ZZZ010421;38571;38571;1042-ZZZ-30;3;MACRO;ID;;6010;204;08;200010904;;200010904;22347;AB;2;;;

我的正则表达式应如何与字段2014-XXX-10YYY016582ZZZ010421匹配?一个字段,三种不同的格式

我尝试了(xxx)|(bbb)|(ccc),但没有成功。

更多地解释litle。我正在从文件中读取行,并将由分号;分隔的值导入MySQL。所以我需要将所有字段存储到变量中。我不想在这里使用拆分。粗体值只是示例,它可以是不同的,但始终是三种格式之一YYY\d{6}ZZZ\d{6}\d{4}-XXX-\d

3 个答案:

答案 0 :(得分:1)

您可以进行匹配和替换。

$ perl -pe 's/^[^;]*;([^;]*);.*/\1/' file
2014-XXX-10
YYY016582
ZZZ010421

答案 1 :(得分:1)

如果您只想匹配这三个字符串中的任何一个,那么您可以编写

/(?<![0-9A-Z\-])(2014-XXX-10|YYY016582|ZZZ010421)(?![0-9A-Z\-])/

负向前瞻和后瞻是为了确保您不匹配恰好包含其中一个值的较长字段的一部分


<强>更新

如果您要匹配任何看起来像9999-AAA-99AAA999999的内容,那么它应该是

/ (?<![0-9A-Z\-]) ( \d{4}-[A-Z]{3}-\d{2} | [A-Z]{3}\d{6} ) (?![0-9A-Z\-]) /x

<强>更新

如果您使用split那么它会更简单。喜欢这个

use strict;
use warnings;
use 5.010;

while ( <DATA> ) {
  chomp;
  my @matches = grep /^ (?: YYY\d{6} | ZZZ\d{6} | \d{4}-XXX-\d{2} ) $/x, split /;/;
  say "@matches";
}


__DATA__
2061;2014-XXX-10;51636;51636;2014-XXX-10;1;MACRO;ID;;3060;204;08;;;;;;1;;;2061;YYY016582;2099130;11;1658-YYY-20;1;MACRO;ID;64501;;204;08;20010314;;20010314;60454;AA;1;;;2061;ZZZ010421;38571;38571;1042-ZZZ-30;3;MACRO;ID;;6010;204;08;200010904;;200010904;22347;AB;2;;;

<强>输出

2014-XXX-10 2014-XXX-10 YYY016582 ZZZ010421

<强>更新

除非您对数据没有信心并且需要处理格式错误的记录,否则我认为您只需要对记录执行简单的split。像这样。

很难说明。此代码只打印由方括号括起来的数据中的字段,并且前面是找到的字段数。您可能希望将信息写入数据库而不是打印它

use strict;
use warnings;
use 5.010;

while ( <DATA> ) {
  chomp;
  my @fields = split /;/;
  printf "%d: %s\n", scalar @fields, join(' ', map "[$_]", @fields);
}


__DATA__
2061;2014-XXX-10;12345;12345;2014-XXX-10;1;MACRO;ID;;3060;204;08;;;;;;1;;;
2061;YYY016582;2099130;11;1658-YYY 20;1;MACRO;ID;64543;;204;08;20010314;;20010314;60454;AA;1;;;
2061;ZZZ010421;38571;38571;1042-ZZZ-30;3;MACRO;ID;;6010;204;08;200010904;;200010904;22347;AB;2;;;

<强>输出

18: [2061] [2014-XXX-10] [12345] [12345] [2014-XXX-10] [1] [MACRO] [ID] [] [3060] [204] [08] [] [] [] [] [] [1]
18: [2061] [YYY016582] [2099130] [11] [1658-YYY 20] [1] [MACRO] [ID] [64543] [] [204] [08] [20010314] [] [20010314] [60454] [AA] [1]
18: [2061] [ZZZ010421] [38571] [38571] [1042-ZZZ-30] [3] [MACRO] [ID] [] [6010] [204] [08] [200010904] [] [200010904] [22347] [AB] [2]

答案 2 :(得分:0)

使用此RegEx:/(\d{4}-)?[A-Z]+-?\d+/g

Demo

<强>解释

enter image description here


编辑:为了回应更新的问题,您可以使用以下正则表达式:

/(Y{3}\d{6})|(Z{3}\d{6})|(\d{4}-X{3}-\d+)/g

Demo & Explanation