0

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

.
.
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

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

4

2 回答 2

4

?:好吧,最简单的方法就是使用regex 运算符将捕获组转换为非捕获组:

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

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

于 2013-09-06T21:13:13.733 回答
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 
于 2013-09-06T22:08:31.953 回答