Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Perl中匹配多行字符串_Regex_Perl - Fatal编程技术网

Regex 在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

我是Perl新手,我想知道是否有人可以帮助我

我有这样一个输入:

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