Как сопоставить цифры одинаковой длины в строке с помощью регулярных выражений - PullRequest
0 голосов
/ 12 апреля 2020

Я хочу найти текст (например: стек) в строке, содержащей цифры и символы (например: s123t123a123c123k). Единственное правило заключается в том, что между каждым символом ключа поиска должно быть одинаковое количество цифр, поэтому все это должно совпадать:

search key: stack

Strings:
stack                  //0 digit between chars of stack
s7t3a9c0k              //1 digit between chars of stack
s27t33a49c50k          //2 digit between chars of stack
s127t312a229c330k      //3 digit between chars of stack and so on for 4,5,6 digits...

Если бы я мог сопоставить цифры одинаковой длины, я мог бы написать что-то вроде : s [] * t [] * a [] * c [] * k, если регулярное выражение для той же длины di git равно []. Как сопоставить цифры одинаковой длины в строке с помощью регулярных выражений?

1 Ответ

0 голосов
/ 12 апреля 2020

Если вы хотите сделать это с 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, где он используется .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...