Если вы хотите сделать это с Perl, вы можете использовать
m/s(\d+)t(??{ "\\d{".length($^N)."}" })a(??{ "\\d{".length($^N)."}" })c(??{ "\\d{".length($^N)."}" })k/
или, если вы хотите сопоставить цифры с [0-9]
:
m/s([0-9]+)t(??{ "[0-9]{".length($^N)."}" })a(??{ "[0-9]{".length($^N)."}" })c(??{ "[0-9]{".length($^N)."}" })k/
In код Perl, вы, скорее всего, захотите построить шаблон динамически. См. Полную демонстрационную версию кода Perl:
#!/usr/bin/perl
use warnings;
use strict;
use re 'eval'; # stackoverflow.com/a/16320570/3832970
my @input = split /\n/, <<"END";
s7t3a9c0k
s27t33a49c50k
s127t312a229c330k
s1t312a22c3300k
END
my $keyword = "stack";
my $pattern = substr($keyword, 0, 1) . '([0-9]+)' . join( '(??{ "[0-9]{".length($^N)."}" })', split("", substr($keyword, 1)) );
#my $pattern = substr($keyword, 0, 1) . '(\d+)' . join( '(??{ "\\\\d{".length($^N)."}" })', split("", substr($keyword, 1)) );
for my $input ( @input ) {
if ($input =~ m/$pattern/) {
print $input . ": PASS!\n";
} else {
print $input . ": FAIL!\n"
}
}
Вывод:
s7t3a9c0k: PASS!
s27t33a49c50k: PASS!
s127t312a229c330k: PASS!
s1t312a22c3300k: FAIL!
$pattern
создается динамически: substr($keyword, 0, 1)
получает первый символ, затем ([0-9]+)
добавляется, затем join( '(??{ "[0-9]{".length($^N)."}" })', split("", substr($keyword, 1))
добавляет следующее: вставляет (??{ "[0-9]{".length($^N)."}" })
между каждым символом подстроки $keyword
из второго символа. Часть (??{ "[0-9]{".length($^N)."}" })
действует как шаблон \d{X}
, где X
- длина самой последней захваченной подстроки (это было ([0-9]+)
).
use re 'eval';
необходим для динамического построения шаблона , Согласно этому ответу , он будет влиять только на регулярные выражения в файле или в curlies, где он используется .