在perl中的REGEX,从n次出现开始匹配

时间:2016-11-23 19:24:29

标签: regex perl

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

elem1 | elem2 | elem3 | elem4 | elem5 | elem6
                  ^

删除结果:

elem1 | elem2 | elem3 | elem5 | elem6

希望你理解我的问题。感谢

2 个答案:

答案 0 :(得分:0)

^((?:[^|]+\|){3})[^|]+\|(使用全局和多行标记)

elem1 | elem2 | elem3 | elem4 | elem5 | elem6
^^^^^^^^^^^^^^^^^^^^^^^ group 1
                       ^^^^^^^^ included in the match

将其替换为group 1elem4将被删除。我将解释正则表达式如何很快起作用。

  • ^开始一行
  • ((?:[^|]+\|){3})被捕获的群组
    • (?:[^|]+\|)一个或多个非管道字符和文字管道字符
    • {3}正好重复该模式3次
  • [^|]+一个或多个非管道字符
  • \|文字管道字符

答案 1 :(得分:0)

您可以使用全局修饰符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; 并逐步搜索第N个字段。然后只需删除以下字段

喜欢这个

elem1 | elem2 | elem3 | elem5 | elem6

输出

split

但这不适用于字符串中的最后一个字段。最整洁的方法可能是使用joinuse 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;

喜欢这个

<? **sql stuff**

  $clearfix = ($your_sql_loop_index %3 === 0) ? 'clearfix' : '';
?>
<div class="col-1-3 <?php echo $clearfix; ?>">

输出与上面的代码相同