Regex - матч до следующего матча - PullRequest
0 голосов
/ 12 апреля 2011

Я хотел бы повторять совпадения по тексту, блоки, которые я хочу сопоставить, начинаются с цифры, а затем символа табуляции.

Мое начальное совпадение ^\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 ]

1 голос
/ 12 апреля 2011

Следующее регулярное выражение должно делать то, что вы хотите:

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

Это будет соответствовать некоторому количеству цифр, за которым следует вкладка, а затем любому количеству не цифр или цифр, за которыми не следует вкладка.

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

edit : Хорошо, этот должен работать!

0 голосов
/ 13 апреля 2011

Пример ввода и ожидаемые результаты могут помочь, поскольку я не совсем уверен, что знаю, что вы ищете.

Если вы просто сопоставляете один шаблон, вы можете разбить строку:

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
0 голосов
/ 12 апреля 2011
while (/
    \G
    ( \d+\t )
    ( (?: (?! \d+\t ) . )* )
/xg) {
    print("match:  $1\n");
    print("buffer: $2\n");
}
0 голосов
/ 12 апреля 2011

Наверное, это?

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