regex - 什么正则表达式可以提取 perl 中除 <> 之外的所有数据?

标签 regex linux perl

我有字符串

Message <Network=Data Center> All Verified

我需要提取除尖括号中的字符串之外的所有字符串

我试过了

m/(?![^<]*\\>)/s

没有给出想要的结果。

最佳答案

正在删除 <..>地区

删除 <..> 更容易从字符串中取出部分,然后处理剩余的字符串。

试试这个单行:

cat file | perl -pne 's/<[^>]*?>//g;'

对于您的示例输入,这是输出:

Message  All Verified

注意non-greedy quantifier ?在正则表达式中使用。另外,因为这是一个单线,s///搜索和替换构造应用于 $_隐式变量(来自标准输入的一行)。因此,在此 oneliner 中运行搜索和替换后,$_将被更改(其中不会有 <..> 区域)。还有-p用于打印变量 $_运行代码块后。您可以在 perlrun 中阅读有关 Perl 命令行开关的更多信息。 .

这是一种解决方案。下面还有另一张:

捕获 <..> 之外的区域

另一方面,您可以(如果您愿意)匹配 <..> 之外的部分地区。

为了做到这一点,让我们构建一个正则表达式。首先,我们想要一个<>自由区。以下正则表达式正好匹配

$p = ([^<>]*) .

接下来,我们要匹配 < 之前的所有内容,为此我们可以写 (?:$p<)以及 > 之后的所有内容,那就是(?:>$p) .

现在,如果我们将所有这些部件组装在一起,我们会得到 (?:>$p)|(?:$p<) .

请注意(?:)是一个非捕获组。

现在有两个捕获组(上面看到的两个$p),但一次只有一个匹配,因此一些捕获将是undef 。我们必须将它们过滤掉。

最后,我们可以组装所有捕获的内容,就完成了。

cat file | perl -ne '$p="([^<>]*)";@x=grep{defined} m{(?:>$p)|(?:$p<)}g; print join(" ",@x)."\n";'

Parse::Yapp解析器

您可能认为使用 Parser::Yapp 对于这个特定的问题有点太多了(通常,如果你有一些复杂的东西需要解析,你会使用语法和 parser generator ),但是..为什么不呢..:)

好的,所以我们需要一个语法,这里有一个 grammar_file.yp :

#header

%%

#rules
expression:
| exterior '<' interior '>' exterior
| exterior
;

exterior:
| TOK { $_[0]->YYData->{DATA} .= $_[1]; }
| expression
;

interior: TOK;

%%
#footer

sub Error { my ($parser)=shift; }

sub Lexer {
    use Data::Dumper;
    my($parser)=shift;
    $parser->YYData->{INPUT} or return('',undef);
    #$parser->YYData->{INPUT}=~s/^\s+//;
    for ($parser->YYData->{INPUT}) {
        return ('TOK',$1) if(s/^([^<>]+)//);
        return (   $1,$1) if(s/^([<>])//);
    };
}

您会注意到上面的语法中 interior被完全忽略,并且仅来自 exterior 的终端已收集。

这是一个小程序,它将使用解析器(MyParser.pmgrammar_file.yp生成)parse.pl :

#!/usr/bin/env perl
use strict;
use warnings;
use MyParser;
my $parser=MyParser->new;
$parser->YYData->{INPUT} = "Message <Network=Data Center> All Verified";
my $value=$parser->YYParse(
    yylex   => \&MyParser::Lexer,
    yyerror => \&MyParser::Error,
    #yydebug => 0x1F,
);
my $nberr=$parser->YYNberr();
my $data=$parser->YYData->{DATA};
print "Result=$data"

现在是Makefile我们就完成了:

generate_parser_module:
    yapp -m MyParser grammar_file.yp; 

run:
    perl parse.pl

all: generate_parser_module

注意

可以在这里找到更多解析器生成器

关于regex - 什么正则表达式可以提取 perl 中除 <> 之外的所有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23437424/

相关文章:

Perl:如何从基类导入子程序?

regex - 如何根据行的特殊部分对文件的行进行排序

C# - 用分号替换换行符

java - 什么是正确的正则表达式?

android - Ashmem 保留政策

mysql - 在单个 MySQL 查询中更新多个列是否有限制?

javascript - 使用javascript解析SVG转换属性

Python如何在运行脚本处理文件时传入一个可选的文件名参数

android - shell脚本中的if []还有其他选项吗?

regex - 正则表达式中使用的未知特殊变量