perl中的REGEX,从元素e的n次出现开始匹配
我需要你帮我做一些正则表达式。我有一个.csv文件,其中的字段用管道分隔,我需要一个从该管道的n个引用开始工作的正则表达式,并在包含下一个“|”之后删除元素。例如,从第三条管道开始:perl中的REGEX,从元素e的n次出现开始匹配,regex,perl,Regex,Perl,我需要你帮我做一些正则表达式。我有一个.csv文件,其中的字段用管道分隔,我需要一个从该管道的n个引用开始工作的正则表达式,并在包含下一个“|”之后删除元素。例如,从第三条管道开始: elem1 | elem2 | elem3 | elem4 | elem5 | elem6 ^ 删除结果: elem1 | elem2 | elem3 | elem5 | elem6 希望你能理解我的问题。谢谢(使用全局和多行标志) 将其替换为组1,将删除elem4。我将很快
elem1 | elem2 | elem3 | elem4 | elem5 | elem6
^
删除结果:
elem1 | elem2 | elem3 | elem5 | elem6
希望你能理解我的问题。谢谢(使用全局和多行标志)
将其替换为组1
,将删除elem4
。我将很快解释正则表达式是如何工作的
行的开头^
捕获的组(((?:[^ |]+\\|){3})
1个或多个非管道字符和文字管道字符(?:[^ |]+\\\)
将该模式重复3次{3}
1个或多个非管道字符[^ |]+
文字管道字符\\\124;
/g
并增量搜索第n个字段。然后删除下面的字段
像这样
use strict;
use warnings 'all';
use feature 'say';
my $s = 'elem1 | elem2 | elem3 | elem4 | elem5 | elem6';
$s =~ /\|/g for 1 .. 3;
$s =~ s/\G.*?\|//;
say $s;
use strict;
use warnings 'all';
use feature 'say';
my $s = 'elem1 | elem2 | elem3 | elem4 | elem5 | elem6';
$s = do {
my @s = split /\|/, $s;
splice @s, 3, 1;
join '|', @s;
};
say $s;
输出
但这对字符串中的最后一个字段不起作用。最整洁的方法可能是使用split
和join
像这样
use strict;
use warnings 'all';
use feature 'say';
my $s = 'elem1 | elem2 | elem3 | elem4 | elem5 | elem6';
$s =~ /\|/g for 1 .. 3;
$s =~ s/\G.*?\|//;
say $s;
use strict;
use warnings 'all';
use feature 'say';
my $s = 'elem1 | elem2 | elem3 | elem4 | elem5 | elem6';
$s = do {
my @s = split /\|/, $s;
splice @s, 3, 1;
join '|', @s;
};
say $s;
输出与上面代码的输出相同为什么要使用正则表达式?阅读该行,在
|
上拆分它,从列表中删除元素,然后将其重新连接在一起。无论如何,您可以在regexp之后使用{n}
来匹配模式的n
出现次数。因此s/^((模式){3})模式/$1/
将删除模式的第四次出现次数。