我想从字符串中过滤一些子字符串:
.
.
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
如何在正则表达式中过滤匹配而不进行替换?
答案 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