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/4/postgresql/10.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
perl中的REGEX,从元素e的n次出现开始匹配_Regex_Perl - Fatal编程技术网

perl中的REGEX,从元素e的n次出现开始匹配

perl中的REGEX,从元素e的n次出现开始匹配,regex,perl,Regex,Perl,我需要你帮我做一些正则表达式。我有一个.csv文件,其中的字段用管道分隔,我需要一个从该管道的n个引用开始工作的正则表达式,并在包含下一个“|”之后删除元素。例如,从第三条管道开始: elem1 | elem2 | elem3 | elem4 | elem5 | elem6 ^ 删除结果: elem1 | elem2 | elem3 | elem5 | elem6 希望你能理解我的问题。谢谢(使用全局和多行标志) 将其替换为组1,将删除elem4。我将很快

我需要你帮我做一些正则表达式。我有一个.csv文件,其中的字段用管道分隔,我需要一个从该管道的n个引用开始工作的正则表达式,并在包含下一个“|”之后删除元素。例如,从第三条管道开始:

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/
将删除模式的第四次出现次数。