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

Я

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

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

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

на этой странице предлагает мне использовать d, но как?

4 ответов


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

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

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

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

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

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

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

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

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

translate все символы complement из 0-9 ни к чему,delete их.

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

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

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

совпадение в контексте списка возвращает список захватов. Родители вокруг $str просто поместить выражение в контекст списка и назначить первый захват $str.


лично я бы сделал так:

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

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