匹配没有匹配的替换

时间:2013-09-06 21:09:12

标签: regex perl

我想从字符串中过滤一些子字符串:

.
.
th>Di, -12 ;0907<th
th>Mi, -44 ;1007<th
th>Do, -66 ;1107<th
.
.

我的perl脚本是:

.
.
my (@d,$h,$s);
@d=$h=~/(th>(Di|Mi|Do), -\d\d ;\d\d\d\d<th)/igs;
foreach $s (@d)
   {print  "$s\n";};  

Output is:
th>Di, -12 ;0907<th
Di
th>Mi, -44 ;1007<th
Mi
th>Do, -66 ;1107<th
Do

我的问题,我需要这个输出:

th>Di, -12 ;0907<th
th>Mi, -44 ;1007<th
th>Do, -66 ;1107<th

如何在正则表达式中过滤匹配而不进行替换?

2 个答案:

答案 0 :(得分:4)

嗯,最简单的方法就是使用?:正则表达式运算符将捕获组转换为非捕获组:

@d=$h=~/(th>(?:Di|Mi|Do), -\d\d ;\d\d\d\d<th)/igs;

实际上,?:通常与|一起使用:为了限制交替的范围,你必须使用括号,但你也不必利用它们的主要效果(捕获)。

答案 1 :(得分:1)

如果您知道您的数据在以下行中具有相同数量,则可以执行..

(th>(?:Di|Mi|Do),\s+-\d{2}\s+;\d{4}<th)

如果您的号码长度不同,那么我会这样做。

(th>(?:Di|Mi|Do),\s+-\d+\s+;\d+<th)

请使用\s

,而不是在正则表达式中使用空格
\s+          matches whitespace (\n, \r, \t, \f, and " ") (1 or more times)

原因是,如果您的数据有多个空格,那么正则表达式将与以下内容不匹配:

th>Di,  -12  ;0907<th
th>Mi,   -44  ;1007<th