2010-08-26 3 views
8

У меня естьКак извлечь номер из строки в Perl?

print $str; 
abcd*%1234$sdfsd..#d 

Строка всегда будет иметь только один непрерывный отрезок чисел, как 1234 в этом случае. Остальные все будут либо алфавитами, либо другими специальными символами.

Как я могу извлечь номер (1234 в этом случае) и сохранить его обратно в str?

This page предполагает, что я должен использовать \d, но как?

ответ

17
$str =~ s/\D//g; 

Это удаляет все недигитные символы из строки. Это все, что вам нужно сделать.

EDIT: если цифры Unicode в других сценариях могут присутствовать, лучшим решением является:

$str =~ s/[^0-9]//g; 
+1

Lazer просит номер, а не целое число. Это регулярное выражение будет падать '.',' e', которое может использоваться для формирования float. Также '\ d' не просто' [0-9] ', из-за поддержки Unicode в Perl: цифры в других глифах (например, indian) действительны. Таким образом, ваше регулярное выражение также примет строки, которые не являются числами. – dolmen

+0

@ dolmen Lazer должен быть более конкретным. Его пример не включает десятичные знаки или экспоненты, и я не могу точно знать, хочет ли он включить их или нет. Вы правы в символах сценария unicode, но я отредактирую. –

26

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

my $str = 'abc 123 x456xy 789foo'; 

my ($first_num) = $str =~ /(\d+)/; # 123 
my @all_nums = $str =~ /(\d+)/g; # (123, 456, 789) 
+0

+1. Это имеет преимущество перед моим ответом, что он не предполагает, что в строке есть только один встроенный номер. –

1

Лично я хотел бы сделать это следующим образом:

$s =~ /([0-9]+)/; 
print $1; 

$ 1 будет содержать первую группу соответствует заданному регулярному выражению (часть адреса в круглых скобках).

+2

Никогда не используйте значение в '$ 1',' $ 2' и т. Д., Если вы не подтвердили, что ваш матч прошел успешно. Переменная захвата только (re) устанавливается в успешном совпадении, если '$ s' в вашем примере не имеет цифр, вы получите результат своего последнего совпадения. –

+0

Ничего себе, как глупо меня. Спасибо за объяснение. Просто чтобы убедиться, что я изучаю мой урок ... Является ли 'if ($ s = ~/([0-9] +) /) print $ 1' правильным способом использования переменных группировки? – Ziggy

4

Если вы хотите сделать это разрушительным способом, это самый быстрый способ сделать это.

$str =~ tr/0-9//cd; 

tr anslate все символы в c omplement из 0-9 ни к чему, d далить их.

Остерегайтесь этого подхода, а также Филлипа Поттера, это то, что там была еще одна группа цифр дальше по строке, они были бы объединены с первой группой цифр. Поэтому не ясно, что вы захотите это сделать.

безошибочный способ получить один и только одна группа цифр

($str) = $str =~ /(\d+)/; 

матч, в контексте списка возвращает список захватами. Параны вокруг $str просто помещают выражение в контекст списка и назначают первый захват $str.

+0

Лучший ответ! – dolmen

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