我有字符串
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.pm
从grammar_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/