我想在文本上迭代匹配,我想匹配的块以数字开头,然后是制表符。
我的开始匹配是^\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。
答案 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