2012-04-18 3 views
0

Допустим, я хочу, чтобы соответствовать и захватить 5 целых чисел, разделенных одним или несколькими пробелами - пример ввода:Perl Regular Expression - Dynamic Спички

Я мог бы это сделать :

my $input = '1111  234   3333   456 7890'; 
if($input =~ /^\s*([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)/) 
{ 
    #$1 = '1111', $2 = '234', $3 = '3333', $4= '456', $5 = '7890' 
} 

Но я хочу сделать что-то вроде этого, чтобы регулярное выражение проще, а не повторять каждый раз INT 5 явно:

my $input = '1111  234   3333   456 7890'; 
if($input =~ /^((\s*[0-9]+){5})/) 
{ 
    #$1 = '1111  234   3333   456 7890'; 
    #$2 = ' 7890' 
    #all other capture variables are undefined 
} 

Однако захваты, похоже, не работают.

Есть ли способ, которым я могу это сделать и все еще получать доступ к моим 5 захватам?

Еще лучше было бы неизвестное количество захватов:

my $input = '1111  234   3333   456 7890'; 
if($input =~ /^((\s*[0-9]+)+)/) 
{ 
    #foreach capture 1..N do something... 
} 
+0

'мои = $ массиве @numbers вход = ~/\ d +/G'? – TLP

+0

Вы ищете код, который займет всего 5 элементов ввода? Если это так, проверьте ответ ниже. –

ответ

4
my @numbers = $input =~ /\d+/g; 

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

+2

Кто-то хочет объяснить нисходящее движение? Он явно попросил захватить целые числа, разделенные пробелами. – TLP

0

Если вы знаете, что разделитель (в данном случае, один или несколько пробелов), то вам не нужно регулярное выражение, чтобы захватить что ты хочешь. Вы можете использовать split.

use strict; 
use warnings; 

my $input = "1111  234   3333   456 7890"; 
my @ints=split /\s+/,$input; 
print "$_\n" foreach(@ints); 

Который выводит:

1111 
234 
3333 
456 
7890 
+0

да, что будет работать благодаря - и, вероятно, что я буду делать. я все еще хотел бы знать, возможно ли это, поскольку я разбираю текстовый файл, чтобы регулярное выражение знало, является ли я совпадением, поэтому было бы неплохо совпадение и захват за один шаг, а не 2 шага - совпадение, затем разделение , – user210757

+0

Ну, в вашем файле вы можете запускать строки через регулярное выражение '/ ((?: \ D + \ s +) +) \ d + /', которое должно совпадать с одной или несколькими цифрами, разделенными одним или несколькими пробелами. Затем, если вы получите соответствие этому регулярному выражению, разделите его на '/ \ s + /' и оттуда. –

+1

Downvoter: Помогите объяснить? –

0

ли модель линии всегда значные группы, разделенные пробелами? Если это так, а не регулярное выражение, то почему бы не разделить на массив на основе пробельных

@outArray = split (/ +/,$input); 
-1

Следующие будут захватывать первые 5 целых чисел и игнорировать их после этого, если это то, что вам нужно. Возможно, я не совсем понимаю.

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

my $in = '1111  234   3333   456 7890 12 13'; 

my @ints = (split ' ', $in)[0 .. 4]; 

print "@ints\n"; 

Печать:

1111 234 3333 456 7890 

Chris

+0

Почему вы остановились на 5? –

+0

Я думал, что мигт будет более 5, так как он сформулировал свой вопрос. Я не знал о его намерениях. –

+0

Нет, я не был - я как-то спросил обоих, но доволен либо ответом. благодаря – user210757