正则表达式 - 当组包含多个捕获时替换

时间:2010-10-25 14:00:56

标签: regex

我在尝试使用我的正则表达式进行替换时遇到了麻烦。

以下是我正在使用的一些示例数据:

$/Data:
$One
$Two

$/New:
$Four
$Five

以下是我想获得的结果:

$/Data/One
$/Data/Two
$/New/Four
$/New/Five

目前,我正在使用此正则表达式:

(\$/.*?):\r\n(?:(?:\$(.*)\r\n)*)+

这允许我捕获这些数据

\1 => $/Data
\2 => One
      Two

... same for other group

有没有办法通过正则表达式获得所需的结果?目前,当我使用\1/\2替换时,我只获得\ 2捕获组的最后一项的替换。

2 个答案:

答案 0 :(得分:1)

的Perl?我倾向于在循环中执行此操作,找到$ /:行,提取任何内容然后将其拼接到所有后续行中,直到另一个$ /:行

答案 1 :(得分:1)

由于你没有说语言,这里有一个perl脚本来完成这项工作:

#!/usr/bin/perl 
use 5.10.1;
use warnings;
use strict;
use Data::Dumper;

my $str = '$/Data:
$One
$Two

$/New:
$Four
$Five';

my @l = split/\r?\n/, $str;
my @arr;
my $res;
for(@l) {
  chomp;
  if (m!^(\$/.*?):!) {
    $res = $1;
  } elsif (m!^\$(.+)$!) {
    push @arr, $res.'/'.$1;
  } elsif( m!^$!) {
    $res = '';
  }
}
say Dumper \@arr;

输出:

$VAR1 = [
          '$/Data/One',
          '$/Data/Two',
          '$/New/Four',
          '$/New/Five'
        ];