正则表达式 - 匹配下一场比赛

时间:2011-04-12 17:44:27

标签: regex perl anchor match

我想在文本上迭代匹配,我想匹配的块以数字开头,然后是制表符。

我的开始匹配是^\d+\t,但有没有办法表明我希望包含此匹配的所有文字直到下一场比赛?

输入数据:

1       111.111.111.111
111.111.111.111
                    Host IP     111.111.111.111
111.111.111.111
111.111.111.111         Host IP     TCP             app     11111, 11111, 11111, 11111      Allow
2       111.111.111.111
111.111.111.111
111.111.111.111         Host IP     111.111.111.111
111.111.111.111         Host IP     TCP             app     11111, 11111, 11111, 11111      Allow
3       111.111.111.111
111.111.111.111         Host IP     111.111.111.111
111.111.111.111
111.111.111.111
111.111.111.111         Host IP     TCP             app     11111, 11111, 11111, 11111      Allow
4       111.111.111.111
111.111.111.111
111.111.111.111
111.111.111.111         Host IP     111.111.111.111
111.111.111.111         Host IP     TCP             app     11111, 11111, 11111, 11111      Allow

我正在使用Perl。

4 个答案:

答案 0 :(得分:1)

以下正则表达式应该做你想要的:

^\d+\t(?:[^\d]+|[\d]+(?!\t))*

这将匹配一些数字后跟一个标签,然后是任意数量的非数字或数字,后面没有标签。

my @matches = $data =~ /^\d+\t(?:[^\d]+|[\d]+(?!\t))*/mg;

编辑:好的,这个应该有效!

答案 1 :(得分:0)

可能,这个?

/^\d+\t.*?(?:\z|^\d+\t)/ms

答案 2 :(得分:0)

while (/
    \G
    ( \d+\t )
    ( (?: (?! \d+\t ) . )* )
/xg) {
    print("match:  $1\n");
    print("buffer: $2\n");
}

答案 3 :(得分:0)

样本输入和预期结果会有所帮助,因为我不确定我知道你在寻找什么。

如果您只对一种模式进行匹配,则可以拆分字符串:

my $string = "text\n1\ttest\n2\tend\n";
my @matches = split /^(\d+)\t/m, $string;
shift @matches; # remove the text before the first number
print "[$_]\n" for @matches;

__END__
Output:
[1]
[test
]
[2]
[end
]

如果您匹配的多个模式Perl具有特殊变量,可以让您找到匹配开始和结束的位置。可用于提取两场比赛之间的内容。

use English qw(-no_match_vars);

my $string = "1\ttestEND\n2\ttextEND\n";
if ($string =~ /^\d+\t/) {
    my $last_match_end = $LAST_MATCH_END[0];

    if ($string =~ /END/cg) {
        my $last_match_start = $LAST_MATCH_START[0];
        my $len = $last_match_start - $last_match_end;
        print substr($string, $last_match_end, $len) . "\n"
    }
}
__END__
Output:
test