Как извлечь число из строки в Perl? - PullRequest
9 голосов
/ 26 августа 2010

У меня есть

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

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

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

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

Ответы [ 4 ]

28 голосов
/ 26 августа 2010

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

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

my ($first_num) = $str =~ /(\d+)/;   # 123
my @all_nums    = $str =~ /(\d+)/g;  # (123, 456, 789)
18 голосов
/ 26 августа 2010
$str =~ s/\D//g;

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

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

$str =~ s/[^0-9]//g;
4 голосов
/ 26 августа 2010

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

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

tr аннулирует все символы в c значении 0-9 в ничто, d выбирает их.

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

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

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

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

1 голос
/ 26 августа 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...