在正则表达式中捕获第一组

时间:2017-09-20 18:34:22

标签: regex

我在文件中有以下日志行

  

2017-09-20 11:52:00 |警告| LEV-APPESB | 200 | 00:00:255 |尼克|   测试

我需要创建一个不同的正则表达式来提取由管道分隔的每个字段(|) 我似乎与正确的正则表达式在正确的道路上

^.*\|(.+?)\|.*$

正则表达式捕获字符串

  

缺口

这是我的文本的最后一次出现,由两个管道(|)

分隔

所以这是我的问题,正则表达式用于:

  • 隔离我的第一列(开头没有管道)
  • 隔离我的线的第1,第2,第3,第4,第5和第6列,这些列都被管道包围
  • 隔离最后一列(最后没有管道)

修改

为了您的信息,正则表达式将用于日志分析系统,允许通过正则表达式创建自定义字段。通过代码拆分字符串不是一个选项

1 个答案:

答案 0 :(得分:0)

问题1

使用非贪婪的算子:/^(.*?)\|/

问题2

抓住每一栏:/^(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|/

贪婪的版本也有效:/^(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|/

问题3

再抓一个:/.*\|(.*)$/

我使用perl测试了所有三个:

#!/bin/perl
$str = "2017-09-20 11:52:00 | WARN | LEV-APPESB | 200 | 00:00:255 | nick | test";
$str =~ /^(.*?)\|/;
print "Column 1: ".$1."\n\n";

$str =~ /^(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|/;
print "Column 1: ".$1."\n";
print "Column 2: ".$2."\n";
print "Column 3: ".$3."\n";
print "Column 4: ".$4."\n";
print "Column 5: ".$5."\n";
print "Column 6: ".$6."\n\n";


$str =~ /^(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|/;
print "Column 1: ".$1."\n";
print "Column 2: ".$2."\n";
print "Column 3: ".$3."\n";
print "Column 4: ".$4."\n";
print "Column 5: ".$5."\n";
print "Column 6: ".$6."\n\n";

$str =~ /^(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)$/;
print "Column 1: ".$1."\n";
print "Column 2: ".$2."\n";
print "Column 3: ".$3."\n";
print "Column 4: ".$4."\n";
print "Column 5: ".$5."\n";
print "Column 6: ".$6."\n";
print "Column 7: ".$7."\n\n";


$str =~ /.*\|(.*)$/;
print "Column 7: ".$1."\n";

该计划的输出是:

Column 1: 2017-09-20 11:52:00

Column 1: 2017-09-20 11:52:00
Column 2:  WARN
Column 3:  LEV-APPESB
Column 4:  200
Column 5:  00:00:255
Column 6:  nick

Column 1: 2017-09-20 11:52:00
Column 2:  WARN
Column 3:  LEV-APPESB
Column 4:  200
Column 5:  00:00:255
Column 6:  nick

Column 1: 2017-09-20 11:52:00
Column 2:  WARN
Column 3:  LEV-APPESB
Column 4:  200
Column 5:  00:00:255
Column 6:  nick
Column 7:  test

Column 7:  test