Регулярное выражение, соответствующее количеству символов, количество которых было проанализировано ранее - PullRequest
3 голосов
/ 20 мая 2011

Скажем, у меня есть файл, который содержит строки, которые выглядят так:

"7sunrIsEfoo"
"10ecological09"
"3bedtime"

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

sunrIsE
ecological
bed

Есть ли способ сделать это с помощью регулярного выражения?Моя первая попытка была:

([0-9]*)[a-zA-Z]{\1}

, но, похоже, это не сработало.

Ответы [ 4 ]

4 голосов
/ 20 мая 2011

Это невозможно с регулярным выражением.

([0-9]*) просто «запоминает» цифры как подстроку: их нельзя использовать численно.

2 голосов
/ 20 мая 2011

В Ruby вы можете использовать:

result = string[/(\d+)([a-zA-Z]+)/,2][0,$1.to_i]

Это даст вам ожидаемый результат.

0 голосов
/ 20 мая 2011

Вот способ сделать это в Perl:

#!/usr/local/bin/perl
use strict;
use warnings;

my @list = ("7sunrIsEfoo", "10ecological09", "3bedtime");
foreach(@list) {
    s/^(\d+)(.+)$/substr($2, 0, $1)/e;
    print $_,"\n";
}

output:

sunrIsE
ecological
bed
0 голосов
/ 20 мая 2011

Регулярные выражения не очень подходят для этой задачи.У них нет встроенного способа интерпретации чисел.Вы можете использовать (грязный) обходной путь, используя

(?<=1).|(?<=2)..|(?<=3)...| 

и т. Д. (Хотя лучше использовать обратный порядок, в противном случае у вас будут проблемы при достижении 11).Обратите внимание, что вы не должны использовать этот метод, если у вас действительно нет другого пути =)

...