Regex 在Perl中搜索和打印正则表达式

Regex 在Perl中搜索和打印正则表达式,regex,perl,Regex,Perl,我需要多次搜索包含正则表达式的输入文件。我需要在新行上打印表达式 "1-BBMD-DC-FB"|4|{47|"Interval"|00:00:00|00:00:00|1}{48|"Interval"|00:00:00|00:00:00|1}{49|"Interval"|00:00:00|00:00:00|1}{52|"Interval"|00:00:00|00:00:00|1}|{1|"Interval"|"All"|0}|{52|"Interval"|"day"} 所需输出应为: 1-BB

我需要多次搜索包含正则表达式的输入文件。我需要在新行上打印表达式

"1-BBMD-DC-FB"|4|{47|"Interval"|00:00:00|00:00:00|1}{48|"Interval"|00:00:00|00:00:00|1}{49|"Interval"|00:00:00|00:00:00|1}{52|"Interval"|00:00:00|00:00:00|1}|{1|"Interval"|"All"|0}|{52|"Interval"|"day"} 
所需输出应为:

1-BBMD-DC-FB"|{47|"Interval"|00:00:00|00:00:00|1}
1-BBMD-DC-FB"|{48|"Interval"|00:00:00|00:00:00|1}
....
如何做到这一点?这就是我所尝试的:

while (<IN>) {
    my ($a,$s,$d,$f,$g,$h,$j) = split (/{/, $_);
    #print ("$a \n");
    print ("$a$s \n");
    print ("$a$d \n");
    print ("$a$d \n");
    print ("$a$f \n");
    print ("$a$g \n");
    print ("$a$h \n");
}
close IN;
while(){
my($a,$s,$d,$f,$g,$h,$j)=拆分(/{/,$);
#打印($a\n);
打印(“$a$s\n”);
打印(“$a$d\n”);
打印(“$a$d\n”);
打印(“$a$f\n”);
打印(“$a$g\n”);
打印(“$a$h\n”);
}
接近;
一个粗糙的解析器(因为它会对某些部分进行两次解析),但简单的解析器:

my$field_re=qr/“[^”]*”[124;[^{}]*/x;
我的$curlies\u re=qr/\{(?:$field\u re(?:\\\\$field\u re)*)?\}/x;
而(){
我的($id,$curlies)=/^($field\u re)\\\\\$field\u re\\\\\\\\($curlies\u re*)\\\\\\/x
或死亡(“无效输入或错误的解析器\n”);
我的@curlies=$curlies=~/$curlies\u re/g;
为@curlies打印($id |$\un);
}
输出:

"1-BBMD-DC-FB"|{47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{52|"Interval"|00:00:00|00:00:00|1}
1-BBMD-DC-FB"|4|{47|"Interval"|00:00:00|00:00:00|1}
{48|"Interval"|00:00:00|00:00:00|1}
{49|"Interval"|00:00:00|00:00:00|1}
{52|"Interval"|00:00:00|00:00:00|1}
{1|"Interval"|"All"|0}
{52|"Interval"|"day"}
"1-BBMD-DC-FB"| {47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {52|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {1|"Interval"|"All"|0}
"1-BBMD-DC-FB"| {52|"Interval"|"day"}
"1-BBMD-DC-FB"|{47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{52|"Interval"|00:00:00|00:00:00|1}

将允许您在数据上测试各种正则表达式,然后您可以将它们转换为代码

我使用{*}作为正则表达式 根据regex星球

    $var = $input =~ $regex
$var=1
$`="1-BBMD-DC-FB"|4|{47|"Interval"|00:00:00|00:00:00|1
$&=}
$'={48|"Interval"|00:00:00|00:00:00|1}{49|"Interval"|00:00:00|00:00:00|1}{52|"Interval"|00:00:00|00:00:00|1}|{1|"Interval"|"All"|0}|{52|"Interval"|"day"}

这是一个进行实验的好地方

通过查看您的输入,有一个可选的
字符

要打印所需内容,请将
}\|?
替换为
}\n

$subject=~s/}/}\n/g;

输出:

"1-BBMD-DC-FB"|{47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{52|"Interval"|00:00:00|00:00:00|1}
1-BBMD-DC-FB"|4|{47|"Interval"|00:00:00|00:00:00|1}
{48|"Interval"|00:00:00|00:00:00|1}
{49|"Interval"|00:00:00|00:00:00|1}
{52|"Interval"|00:00:00|00:00:00|1}
{1|"Interval"|"All"|0}
{52|"Interval"|"day"}
"1-BBMD-DC-FB"| {47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {52|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {1|"Interval"|"All"|0}
"1-BBMD-DC-FB"| {52|"Interval"|"day"}
"1-BBMD-DC-FB"|{47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{52|"Interval"|00:00:00|00:00:00|1}
要拆分:

@result = split(m/}\|?/, $subject, 0);
输出:

"1-BBMD-DC-FB"|{47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{52|"Interval"|00:00:00|00:00:00|1}
1-BBMD-DC-FB"|4|{47|"Interval"|00:00:00|00:00:00|1}
{48|"Interval"|00:00:00|00:00:00|1}
{49|"Interval"|00:00:00|00:00:00|1}
{52|"Interval"|00:00:00|00:00:00|1}
{1|"Interval"|"All"|0}
{52|"Interval"|"day"}
"1-BBMD-DC-FB"| {47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {52|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"| {1|"Interval"|"All"|0}
"1-BBMD-DC-FB"| {52|"Interval"|"day"}
"1-BBMD-DC-FB"|{47|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{48|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{49|"Interval"|00:00:00|00:00:00|1}
"1-BBMD-DC-FB"|{52|"Interval"|00:00:00|00:00:00|1}
使用好的ole


这将使用所需的字符将它们拆分为新行。\n如果需要,您可以选择在上拆分为数组。\n

尝试自己编写一些内容,如果不起作用,请向我们具体说明您所做的工作,以便我们可以帮助您。您启动它,然后我们提供帮助。我们不为您编写它。向我们展示实际的c你已经试过了,然后描述发生了什么和什么不对,然后我们可以帮助你。如果你先自己试一下,很可能你会非常接近答案。@AndyLester我使用了split命令,但是输入不同。while(){my($a,$s,$d,$f,$g,$h,$j)=split(/{,$,$)#print($a\n”);print(“$a$s\n“;print($a$d\n”);print($a$d\n”);print($a$f\n”);print($a$g\n”);print($a$h\n”);}关闭;请注意,您可以执行
my($prefix,@rest)=…
您能否确认应该删除
1-BBMD-DC-FB“
中的
4
是否正确?