2013-03-22 3 views
0

Пример данных:Разбор строки с длиной, указанной в строке

029Extract эта конкретная строка. Не захватывайте ничего другого.

В приведенном выше примере я хотел бы захватить первые n символов сразу после трехзначной записи, которая определяет значение n. И.Е. 29 символов «Извлеките эту конкретную строку».

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

(\d{3})(.{\1}) 
+0

какой язык программирования вы используете? –

+0

Я могу быть гибким, я использовал PHP, Javascript и пару других для работы над одними и теми же данными. –

+2

Вы не сможете интерпретировать «29» как количество символов для регулярного выражения, которое будет использоваться только с помощью регулярного выражения. Сначала вам нужно извлечь 29, а затем создать свое выражение. Я не думаю, что в любом случае регулярное выражение действительно оправдано. –

ответ

1

С перл, вы можете сделать:

my $str = '029Extract this specific string. Do not capture anything else.'; 
$str =~ s/^(\d+)(.*)$/substr($2,0,$1)/e; 
say $str; 

выход:

Extract this specific string. 
+0

Умное однострочное решение проблемы. –

+0

@Balthus: Спасибо , – Toto

0

У вас есть регулярное выражение?

От https://stackoverflow.com/tags/regex/info:

Fools Rush, где ангелы боятся ступить

Огромная сила и выразительность современных регулярных выражений может соблазнить доверчивых - или безрассудно - в попытке использовать регулярные выражений по каждой связанной с цепочкой задаче, с которой они сталкиваются. Это плохая идея, в общем, ...

Вот Python три лайнера:

foo = "029Extract this specific string. Do not capture anything else." 
substr_len = int(foo[:3]) 
print foo[3:substr_len+3] 

А вот PHP три лайнера:

$foo = "029Extract this specific string. Do not capture anything else."; 
$substr_len = (int) substr($foo,0,3); 
echo substr($foo,3,substr_len+3); 
0

Вы не можете сделать это с одним регулярным выражением, в то время как вы можете использовать знания, где обработка регулярных выражений остановки использовать SUBSTR. Например, в JavaScript вы можете сделать что-то вроде этого http://jsfiddle.net/75Tm5/

var input = "blahblah 011I want this, and 029Extract this specific string. Do not capture anything else."; 
var regex = /(\d{3})/g; 
var matches; 
while ((matches = regex.exec(input)) != null) { 
    alert(input.substr(regex.lastIndex, matches[0])); 
} 

Это будет возвращает обе строки:

I want this 
Extract this specific string. 

В зависимости от того, что вы действительно хотите, вы можете изменить Regex чтобы соответствовать только номера начиная с начало строки , соответствуют только первому совпадению и т. д.

Смежные вопросы