Как я могу извлечь все целочисленные значения из строки с помощью регулярных выражений? - PullRequest
3 голосов
/ 27 августа 2009

Я пытаюсь выучить регулярные выражения. У меня есть строка:

$x = "5ft2inches";

Как мне прочитать [5,2] в массив с помощью регулярных выражений?

Ответы [ 8 ]

5 голосов
/ 27 августа 2009

Если вы предполагаете, что строка будет иметь вид "{число} футов {число} дюймов", то вы можете использовать preg_match () :

preg_match('/(\d+)ft(\d+)inches/', $string, $matches);

(\d+) будет соответствовать строке из одной или нескольких цифр. Скобки сообщат preg_match() поместить соответствующие числа в переменную $matches (третий аргумент функции). Функция вернет 1, если она соответствует, и 0, если нет.

Вот как выглядит $matches после успешного матча:

Array
(
    [0] => 5ft2inches
    [1] => 5
    [2] => 2
)

Вся совпадающая строка является первым элементом, затем следуют скобки. Итак, чтобы сделать нужный вам массив:

$array = array($matches[1], $matches[2]);
2 голосов
/ 27 августа 2009

Предполагая PHP, есть ли причина, по которой никто не предложил разделить?

$numbers = preg_split('/[^0-9]+/', $x, -1, PREG_SPLIT_NO_EMPTY);
2 голосов
/ 27 августа 2009

В Perl:

#!/usr/bin/perl

use strict;
use warnings;

my $x = "5ft2inches";
my %height;
@height{qw(feet inches)} = ($x =~ /^([0-9]+)ft([0-9]+)inches$/);

use Data::Dumper;
print Dumper \%height;

Выход:

$VAR1 = {
          'feet' => '5',
          'inches' => '2'
        };

Или, используя split:

@height{qw(feet inches)} = split /ft|inches/, $x;
1 голос
/ 27 августа 2009

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

IE, если вы подходите для любых цифр: (\d+) ( NB: Предполагается, что ваш язык учитывает \ d как ярлык для "любых цифр" )

Затем вы можете извлечь каждую группу, , но вы можете не знать, что ваша строка на самом деле была "5 2inches" вместо "6ft2inches" ИЛИ "29Cabbages1Fish4Cows".

Если вы добавите контекст: (\d+)ft(\d+)inches

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

Если вы не всегда хотите извлечь пару чисел, вам нужно будет сделать различные компоненты необязательными. Проверьте Этот Шпаргалки Регулярного Выражения (его другие чит-листы тоже изящны) для получения дополнительной информации,

1 голос
/ 27 августа 2009

Регулярное выражение просто /[0-9]+/, но как его получить в массиве, полностью зависит от того, какой язык программирования вы используете.

0 голосов
/ 27 августа 2009
use `/[\d]/`
0 голосов
/ 27 августа 2009

Нужно следить за двузначными числами.

/ \ d {1,2} /

может работать немного лучше для футов и дюймов. Максимальное значение «2» должно быть увеличено до того, что подходит.

0 голосов
/ 27 августа 2009

Вы не упоминаете язык, который используете, поэтому вот общее решение: вы не «извлекаете» числа, вы заменяете все, кроме чисел, пустой строкой.

В C # это будет выглядеть как

string numbers = Regex.Replace(dirtyString, "[^0-9]", "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...