我需要你的一些正则表达式的帮助。我有一个.csv文件,其中的字段用管道分隔,我希望一个正则表达式从该管道的n次出现开始工作,并在包含下一个'|'后删除该元素。例如,从第三个管道开始:
elem1 | elem2 | elem3 | elem4 | elem5 | elem6
^
删除结果:
elem1 | elem2 | elem3 | elem5 | elem6
希望你理解我的问题。感谢
答案 0 :(得分:0)
^((?:[^|]+\|){3})[^|]+\|
(使用全局和多行标记)
elem1 | elem2 | elem3 | elem4 | elem5 | elem6
^^^^^^^^^^^^^^^^^^^^^^^ group 1
^^^^^^^^ included in the match
将其替换为group 1
,elem4
将被删除。我将解释正则表达式如何很快起作用。
^
开始一行((?:[^|]+\|){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
但这不适用于字符串中的最后一个字段。最整洁的方法可能是使用join
和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;
喜欢这个
<? **sql stuff**
$clearfix = ($your_sql_loop_index %3 === 0) ? 'clearfix' : '';
?>
<div class="col-1-3 <?php echo $clearfix; ?>">
输出与上面的代码相同