Regex 在Perl中匹配多行字符串
我是Perl新手,我想知道是否有人可以帮助我 我有这样一个输入:Regex 在Perl中匹配多行字符串,regex,perl,Regex,Perl,我是Perl新手,我想知道是否有人可以帮助我 我有这样一个输入: a,b, c、 d,e,f,g,h, i、 j,q//Letras 我正在尝试分别获取/之前的字母,然后在{}之间打印它们,并用:分隔 我试着用这个RE([\w,;:\s\t]*)(\n\124; \/\/)/m,我可以得到每行的所有字母(作为一个字符串,包括分隔符),但不是我想要的 我需要在同一个文件中多次匹配该模式,因此我使用了/g 编辑: 这是我的代码块: while ( <> ) { if ( /([\w
a,b,
c、 d,e,f,g,h,
i、 j,q//Letras
我正在尝试分别获取/
之前的字母,然后在{}
之间打印它们,并用:
分隔
我试着用这个RE([\w,;:\s\t]*)(\n\124; \/\/)/m
,我可以得到每行的所有字母(作为一个字符串,包括分隔符),但不是我想要的
我需要在同一个文件中多次匹配该模式,因此我使用了/g
编辑:
这是我的代码块:
while ( <> ) {
if ( /([\w,;:\s\t]*)(\n|\/\/)/m ) {
print "$1\n";
}
}
while(){
如果(/([\w,;:\s\t]*)(\n\124; \/\/)/m){
打印“$1\n”;
}
}
/m
用于使用^
和$
在字符串中按行匹配多行
另一方面,您正在逐行读取输入。如果一次只查看一行,则不能期望使用单个表达式跨行匹配
相反,通过将$/
设置为适当的值来按块读取。如果块总是以精确的字符串“//Letras\n\n”
结尾,那么任务就更简单了
#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '//';
while (my $chunk = <DATA>) {
chomp $chunk;
my @fields = ($chunk =~ /([a-z])[, ]/g);
next unless @fields;
printf "{%s}\n", join(':', @fields);
}
__DATA__
a,b,
c,d,e,f,g,h,
i,j,q // Letras
a,b,
c,d,e,f,g,h,
i,j,q // Metras
#/usr/bin/env perl
严格使用;
使用警告;
本地$/='/';
while(我的$chunk=){
咀嚼$chunk;
我的@fields=($chunk=~/([a-z])[,]/g);
下一步,除非@fields;
printf“{%s}\n”,连接(“:”,@fields);
}
__资料__
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Letras
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Metras
输出:
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
您还可以使用:
#/usr/bin/env perl
严格使用;
使用警告;
使用File::Stream;
my$stream=文件::流->新建(
\*数据,
分隔符=>qr{(?:\s+/[^\n]+)\n\n}x
);
while(我的$chunk=){
$chunk=~s{\s+/.*\z}{}sx;
$chunk=~s{\n?}{:}gx;
打印“{$chunk}\n”;
}
__资料__
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Letras
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Metras
/m
用于使用^
和$
在字符串中按行匹配多行
另一方面,您正在逐行读取输入。如果一次只查看一行,则不能期望使用单个表达式跨行匹配
相反,通过将$/
设置为适当的值来按块读取。如果块总是以精确的字符串“//Letras\n\n”
结尾,那么任务就更简单了
#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '//';
while (my $chunk = <DATA>) {
chomp $chunk;
my @fields = ($chunk =~ /([a-z])[, ]/g);
next unless @fields;
printf "{%s}\n", join(':', @fields);
}
__DATA__
a,b,
c,d,e,f,g,h,
i,j,q // Letras
a,b,
c,d,e,f,g,h,
i,j,q // Metras
#/usr/bin/env perl
严格使用;
使用警告;
本地$/='/';
while(我的$chunk=){
咀嚼$chunk;
我的@fields=($chunk=~/([a-z])[,]/g);
下一步,除非@fields;
printf“{%s}\n”,连接(“:”,@fields);
}
__资料__
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Letras
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Metras
输出:
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
您还可以使用:
#/usr/bin/env perl
严格使用;
使用警告;
使用File::Stream;
my$stream=文件::流->新建(
\*数据,
分隔符=>qr{(?:\s+/[^\n]+)\n\n}x
);
while(我的$chunk=){
$chunk=~s{\s+/.*\z}{}sx;
$chunk=~s{\n?}{:}gx;
打印“{$chunk}\n”;
}
__资料__
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Letras
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Metras
/m
用于使用^
和$
在字符串中按行匹配多行
另一方面,您正在逐行读取输入。如果一次只查看一行,则不能期望使用单个表达式跨行匹配
相反,通过将$/
设置为适当的值来按块读取。如果块总是以精确的字符串“//Letras\n\n”
结尾,那么任务就更简单了
#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '//';
while (my $chunk = <DATA>) {
chomp $chunk;
my @fields = ($chunk =~ /([a-z])[, ]/g);
next unless @fields;
printf "{%s}\n", join(':', @fields);
}
__DATA__
a,b,
c,d,e,f,g,h,
i,j,q // Letras
a,b,
c,d,e,f,g,h,
i,j,q // Metras
#/usr/bin/env perl
严格使用;
使用警告;
本地$/='/';
while(我的$chunk=){
咀嚼$chunk;
我的@fields=($chunk=~/([a-z])[,]/g);
下一步,除非@fields;
printf“{%s}\n”,连接(“:”,@fields);
}
__资料__
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Letras
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Metras
输出:
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
您还可以使用:
#/usr/bin/env perl
严格使用;
使用警告;
使用File::Stream;
my$stream=文件::流->新建(
\*数据,
分隔符=>qr{(?:\s+/[^\n]+)\n\n}x
);
while(我的$chunk=){
$chunk=~s{\s+/.*\z}{}sx;
$chunk=~s{\n?}{:}gx;
打印“{$chunk}\n”;
}
__资料__
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Letras
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Metras
/m
用于使用^
和$
在字符串中按行匹配多行
另一方面,您正在逐行读取输入。如果一次只查看一行,则不能期望使用单个表达式跨行匹配
相反,通过将$/
设置为适当的值来按块读取。如果块总是以精确的字符串“//Letras\n\n”
结尾,那么任务就更简单了
#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '//';
while (my $chunk = <DATA>) {
chomp $chunk;
my @fields = ($chunk =~ /([a-z])[, ]/g);
next unless @fields;
printf "{%s}\n", join(':', @fields);
}
__DATA__
a,b,
c,d,e,f,g,h,
i,j,q // Letras
a,b,
c,d,e,f,g,h,
i,j,q // Metras
#/usr/bin/env perl
严格使用;
使用警告;
本地$/='/';
while(我的$chunk=){
咀嚼$chunk;
我的@fields=($chunk=~/([a-z])[,]/g);
下一步,除非@fields;
printf“{%s}\n”,连接(“:”,@fields);
}
__资料__
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Letras
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Metras
输出:
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
{a:b:c:d:e:f:g:h:i:j:q}
您还可以使用:
#/usr/bin/env perl
严格使用;
使用警告;
使用File::Stream;
my$stream=文件::流->新建(
\*数据,
分隔符=>qr{(?:\s+/[^\n]+)\n\n}x
);
while(我的$chunk=){
$chunk=~s{\s+/.*\z}{}sx;
$chunk=~s{\n?}{:}gx;
打印“{$chunk}\n”;
}
__资料__
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Letras
a、 b,,
c、 d,e,f,g,h,
i、 j,q//Metras
我认为您的目标是从每行中删除注释(用双斜杠表示),并用大括号和冒号打印出来{a:b:c:d:e:f:g:h:i:j:q}
while ( <> ) { # read each line
chomp; # remove \n from line
s|\s*//.*||; # remove comment
push @values, ':', /[^,]+/g; # store letters in array
}
my $values = join ':', @values; # convert array to string
print "{$values}\n"; # print the results
my $str = "a,b,
c,d,e,f,g,h,
i,j,q // Letras";
$str = join "",map {s/,/:/g ;(split)[0]} split '\n', $str;
print "{$str}";
Sample output
{a:b:c:d:e:f:g:h:i:j:q}
join "",map {s/,/:/g ;(split)[0]} split '\n', $str