不匹配字符串末尾的可选冒号与正则表达式

时间:2014-08-20 15:54:08

标签: regex perl

我正在尝试创建一个正则表达式,用于从字符串的开头到结尾提取所有字符串,但字符串末尾的冒号(:)除外。

字符串是:

ORA-06550: line 10, column 33:
ORA-20000: Schema "TEST" does not exist or insufficient privileges
PLS-00201: identifier 'A' must be declared:

在Perl语言的一个正则表达式中,我想捕获以下字符串:

ORA-06550: line 10, column 33
ORA-20000: Schema "TEST" does not exist or insufficient privileges
PLS-00201: identifier 'A' must be declared

到目前为止,我有以下正则表达式(see online)::

/^(.*)(?::)?$/gm

我的问题是如何构造一个正则表达式,它将从第一个和第三个字符串中删除冒号并同时捕获所有第二个字符串。

5 个答案:

答案 0 :(得分:5)

您可以只删除字符串末尾的冒号,而不是尝试提取所有内容。

$str =~ s/:$//;

答案 1 :(得分:2)

你可以使用这个非贪婪的正则表达式:

/^(.*?):?$/gm

RegEx Demo

答案 2 :(得分:2)

我能想到的最简单的正则表达式是

   /(.+):$/

所以要编辑缓冲区:

  $buffer =~ s/(.+):$/$1/;

但你也可以考虑:

   chop $buffer if $buffer =~ /:$/;

查找尾随冒号,并在找到时将其删除。

答案 3 :(得分:2)

试试这个。

use warnings;
use strict;
@data = <DATA>;
@remove = grep{s/(:$)?//g} @data;
print "@remove\n";

__DATA__
ORA-06550: line 10, column 33:
ORA-20000: Schema "TEST" does not exist or insufficient privileges
PLS-00201: identifier 'A' must be declared:

这段代码会从您的数据中删除。我添加了以匹配前一个字符0或1次。

答案 4 :(得分:1)

这是最快最简单的方法

/^.+(?<!:$)/mg