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?
$str =~ s/\D//g;
Это удаляет из строки все нецифровые символы. Это все, что вам нужно сделать.
РЕДАКТИРОВАТЬ: если цифры 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;
tr
обнулить все символы в c
дополнении 0-9
, d
удалить их.
Одно предостережение в этом подходе, как и в подходе Филиппа Поттера, заключается в том, что если бы была еще одна группа цифр дальше по строке, они были бы объединены с первой группой цифр. Так что не ясно, что вы хотели бы сделать это.
Надежный способ получить одну и только одну группу цифр —
( $str ) = $str =~ /(\d+)/;
Сопоставление в контексте списка возвращает список захваченных слов. Скобки вокруг $str
просто помещают выражение в контекст списка и присваивают первый захват $str
.
Лично я бы сделал так:
$s =~ /([0-9]+)/;
print $1;
$1 будет содержать первую группу, соответствующую заданному регулярному выражению (часть в круглых скобках).