正则表达式仅匹配有效行

皮特·G

我写了一个脚本,总结了很长的日志文件。我的一个小问题是日志很容易出现损坏的条目,因此我的摘要有时包含其中的一些错误行。我的脚本生成了一个中间临时文件,我只需要从中挑选出有效的行即可。

以下几行有效,我需要匹配以下几行:

21/05/14 09:17 134U 0993 EUser_Message 01     
21/05/14 11:07 134UD 0994 User_Message B02    
21/05/14 11:47 134P 0995 User_Message UOD1    
21/05/14 12:41 134B18 0996 User_Message UOD2    
21 / 05/14 14:00 134B 0997 User_Message T02    
21/05/14 14:22 134NV 0998 User_Message D02    
21/05/14 15:25 121U 0999 EUser_Message 03    
21/05/14 16:38 121UD 1000 EUser_Message 04 22/05    
/ 14 07:39 134TP 1001 EUser_Message 08    
22/05/14 09:55 134P 1002 EUser_Message 13   
22/05/14 10:46 134B 1003 EUser_Message 14   
22/05/14 12:00 134NonVac 1004 User_Message UOD3

这些是有效的,因为它们包含字符串“ User_Message”,并且它们以特定的方式非常明确地形成:

(2位数字)(正斜杠)(2位数字)(正斜杠)(2位数字)(3个空格)(2位数字)(冒号)(2位数字)(3个空格)(4至9个字母或数字)(1至6个空格)(4位数字)(4个空格)(“ User_Message字符串”)(0或1个空格)(换行)

需要忽略的条目示例如下:

User_Message UOD1      
19/08/14 11:46 1388 EUser_Message 01     
03/07/13 0645 03/07/13 0646 03/07/13 0647 03/07/13 15:36 134U 0648       
0862 17/04/14 0866 17 / 04/14 0867 17/04/14 0868 17/04/14   
17/04/14 10:04 134TP 0869 EUser_Message 01       
21/05/14 14:02 134B 0982     
0983 22/05/14 22/05/14 12: 48 134U 0984 User_Message UOD1   
1015 03/06/14    
11/07/13 08:12 134B 0011     
11/07/13 12:39 134B 0012    
11/07/13 13:53 134B 0013     
12/07/13 08:01 134P 0014     
12/07/13 08:29 134B 0015

我试图匹配有效行的代码部分是:

if ($line =~ /\d{2}\/\d{2}\/\d{2}\s{3}\d{2}:d{2}\s{3}\d{4}\s{4}.*\n/) {  

如果有人可以向我展示如何正确构建仅与上面显示的有效文本行匹配的正则表达式,我将不胜感激。

清醒

我不会对此进行单正则表达式-正则表达式功能强大,但它们...很好,很容易变得难以理解且容易受到极端情况的攻击。

首先,split将您的代码行放入字段中,然后对每个字段进行验证。一个特别有用的技巧是,您可以非常有效地使用evalTime::Piece->strptime验证日期。

#!/usr/bin/perl
use strict;
use warnings;
use Time::Piece; 

while ( <DATA> ) {
   my ( $date, $time, $somecode, $othercode, $msgtype, $msgcode ) = split;

   if ( $date =~ m,^\d+/\d+/\d+$, 
   and $time =~ m,^\d+:\d+$, 
   and eval { Time::Piece->strptime("$date $time", "%d/%m/%y %H:%M") } ) {
       print "Date is ok\n";
   }
   else { print "$date $time is invalid\n"; next; }

   if ( $somecode =~ m/^\w+\d+$/ ) {  
       print "somecode is ok\n";
   }
   else {
       print "Error with somecode $somecode\n";
   }

   if ( $othercode =~ m,^\d{4}$, ) {
       print "othercode is ok\n";
   }
   else { 
        print "Error with $othercode \n";
        next;
   }

   if ( $msgtype =~ m/User_Message/ 
   and $msgcode =~ m/\w+/ ) {
       print "$msgtype $msgcode ok\n";
   }
   else {
       print "Error with $msgtype $msgcode\n"; 
       next;
   }

   print "Line: $. is ok\n$_";
}

__DATA__
21/05/14   09:17   134U      0993    EUser_Message 01    
21/05/14   11:07   134UD     0994    User_Message B02   
21/05/14   11:47   134P      0995    User_Message UOD1   
21/05/14   12:41   134B18    0996    User_Message UOD2   
21/05/14   14:00   134B      0997    User_Message T02   
21/05/14   14:22   134NV     0998    User_Message D02   
21/05/14   15:25   121U      0999    EUser_Message 03   
21/05/14   16:38   121UD     1000    EUser_Message 04   
22/05/14   07:39   134TP     1001    EUser_Message 08   
22/05/14   09:55   134P      1002    EUser_Message 13  
22/05/14   10:46   134B      1003    EUser_Message 14  
22/05/14   12:00   134NonVac 1004    User_Message UOD3
User_Message UOD1     
19/08/14   11:46   1388    EUser_Message 01    
03/07/13   0645    03/07/13   0646    03/07/13   0647    03/07/13   15:36   134U    0648      
0862    17/04/14   0866    17/04/14   0867    17/04/14   0868    17/04/14  
17/04/14   10:04   134TP   0869    EUser_Message 01      
21/05/14   14:02   134B    0982    
0983    22/05/14   22/05/14   12:48   134U    0984    User_Message UOD1  
1015    03/06/14   
11/07/13   08:12   134B    0011    
11/07/13   12:39   134B    0012   
11/07/13   13:53   134B    0013    
12/07/13   08:01   134P    0014    
12/07/13   08:29   134B    0015

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式匹配有效的电话号码

来自分类Dev

在正则表达式中匹配有效的引号

来自分类Dev

正则表达式以匹配有效的Java路径标识符

来自分类Dev

关于Ruby正则表达式以匹配有效String的困惑

来自分类Dev

改进正则表达式以匹配有效值

来自分类Dev

正则表达式用于匹配仅需以有效序列开头开始的模式

来自分类Dev

正则表达式匹配仅适用于有效日期

来自分类Dev

正则表达式匹配给定路径的所有有效URL变体

来自分类Dev

在分隔符之间匹配正则表达式的有效方法

来自分类Dev

正则表达式匹配包含空格的有效绝对Windows目录

来自分类Dev

匹配正则表达式的URL并非一直有效

来自分类Dev

在正则表达式匹配之间削减输出的最有效方法?

来自分类Dev

正则表达式,用于匹配句子开头,结尾和中间的有效单词

来自分类Dev

Python在有效的正则表达式上未返回任何匹配项

来自分类Dev

正则表达式以匹配文件夹结构中的有效路径

来自分类Dev

使用Ruby正则表达式匹配文件名的最有效方法

来自分类Dev

匹配逗号正则表达式有效,但取反无效

来自分类Dev

如何获取正则表达式匹配的有效部分

来自分类Dev

有效时匹配数字和破折号的正则表达式

来自分类Dev

正则表达式 - 在行首或特定字符之后匹配的最有效表达式

来自分类Dev

有效的域名正则表达式

来自分类Dev

更有效的正则表达式

来自分类Dev

有效的正则表达式?

来自分类Dev

Perl 正则表达式匹配有多个空行

来自分类Dev

正则表达式匹配仅包含空格的行

来自分类Dev

将简单表达式映射到有效的正则表达式

来自分类Dev

expr:正则表达式未检测到有效表达式

来自分类Dev

Unix正则表达式仅列出具有有效版本名称的目录

来自分类Dev

HtmlParser.entityref实际上是用于匹配html实体引用的有效正则表达式吗?

Related 相关文章

  1. 1

    正则表达式匹配有效的电话号码

  2. 2

    在正则表达式中匹配有效的引号

  3. 3

    正则表达式以匹配有效的Java路径标识符

  4. 4

    关于Ruby正则表达式以匹配有效String的困惑

  5. 5

    改进正则表达式以匹配有效值

  6. 6

    正则表达式用于匹配仅需以有效序列开头开始的模式

  7. 7

    正则表达式匹配仅适用于有效日期

  8. 8

    正则表达式匹配给定路径的所有有效URL变体

  9. 9

    在分隔符之间匹配正则表达式的有效方法

  10. 10

    正则表达式匹配包含空格的有效绝对Windows目录

  11. 11

    匹配正则表达式的URL并非一直有效

  12. 12

    在正则表达式匹配之间削减输出的最有效方法?

  13. 13

    正则表达式,用于匹配句子开头,结尾和中间的有效单词

  14. 14

    Python在有效的正则表达式上未返回任何匹配项

  15. 15

    正则表达式以匹配文件夹结构中的有效路径

  16. 16

    使用Ruby正则表达式匹配文件名的最有效方法

  17. 17

    匹配逗号正则表达式有效,但取反无效

  18. 18

    如何获取正则表达式匹配的有效部分

  19. 19

    有效时匹配数字和破折号的正则表达式

  20. 20

    正则表达式 - 在行首或特定字符之后匹配的最有效表达式

  21. 21

    有效的域名正则表达式

  22. 22

    更有效的正则表达式

  23. 23

    有效的正则表达式?

  24. 24

    Perl 正则表达式匹配有多个空行

  25. 25

    正则表达式匹配仅包含空格的行

  26. 26

    将简单表达式映射到有效的正则表达式

  27. 27

    expr:正则表达式未检测到有效表达式

  28. 28

    Unix正则表达式仅列出具有有效版本名称的目录

  29. 29

    HtmlParser.entityref实际上是用于匹配html实体引用的有效正则表达式吗?

热门标签

归档