How to extract a number from a string in Perl?

I have

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

The string would always have only one continuous stretch of numbers, like 1234 in this case. Rest all will be either alphabets or other special characters.

How can I extract the number (1234 in this case) and store it back in str?

This page suggests that I should use \d, but how?

10
задан Lazer 26 August 2010 в 12:10
поделиться

4 ответа

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

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

РЕДАКТИРОВАТЬ: если цифры Unicode могут присутствовать в других скриптах, лучшим решением будет:

$str =~ s/[^0-9]//g;
18
ответ дан 3 December 2019 в 13:22
поделиться

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

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

my ($first_num) = $str =~ /(\d+)/;   # 123
my @all_nums    = $str =~ /(\d+)/g;  # (123, 456, 789)
29
ответ дан 3 December 2019 в 13:22
поделиться

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

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

trобнулить все символы в cдополнении 0-9, dудалить их.

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

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

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

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

4
ответ дан 3 December 2019 в 13:22
поделиться

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

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

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

1
ответ дан 3 December 2019 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: