Nasıl bir regex kullanarak dize tüm tamsayı değerleri ayıklamak?

7 Cevap php

Ben regex öğrenmeye çalışıyorum. Ben dizesi vardır:

$x = "5ft2inches";

Nasıl bir regex kullanarak bir diziye [5,2] okuyabilir?

7 Cevap

Eğer dize formun olacağını varsayarak ise "{sayı} ft {sayı} santim" o zaman kullanabilirsiniz preg_match():

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

(\d+), bir veya daha fazla basamaklı bir dize maç olacak. Parantez preg_match() $matches değişkene (işlevine üçüncü argüman) eşleşen sayıları yerleştirmek için söyleyecektir. Bir eşleşme yapılmış eğer olmasaydı işlevi 0, 1 dönecektir.

İşte $matches, başarılı bir maçtan sonra neye benzediğini:

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

Tüm eşleşen dize ilk unsurdur, sonra parantez maçı izleyin. Yani istediğiniz dizi yapmak için:

$array = array($matches[1], $matches[2]);

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;

Çıktı:

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

Ya da kullanarak split :

@height{qw(feet inches)} = split /ft|inches/, $x;

Düzenli ifade basitçe /[0-9]+/ ancak bir dizi içine almak için nasıl kullandığınız hangi programlama dili bağlıdır.

Düzenli ifadeler ile, ya bir contextless şekilde, ya da bir contextful şekilde veri elde edebilirsiniz.

IE, sen any basamak için maç ise: (\d+) (NB: Assumes that your language honors \d as the shortcut for 'any digits')

Daha sonra but sizin dize aslında yerine "6ft2inches" VEYA "29Cabbages1Fish4Cows" nin "5 2inches" olduğunu bilmiyor olabilir, her grubu elde edebilirsiniz.

Eğer içerik eklerseniz: (\d+)ft(\d+)inches

Bunu bilmek için sure ne (aksi takdirde bir maç olsun istiyorum çünkü) ve ayak ve inç almak için sırayla her grup için başvurabilirsiniz ayıkladığınız ettik.

Her zaman ayıklamak için sayıların bir çift olacak değilseniz, size çeşitli bileşenleri isteğe bağlı olmak gerekir. Çıkış This Regular Expression Cheat Sheet daha fazla bilgi için (O'nun diğer hile yaprak çok şık olan),

PHP, hiç kimse bölünmeyi önerdi herhangi bir neden varsayarsak?

$numbers = preg_split('/[^0-9]+/', $x, -1, PREG_SPLIT_NO_EMPTY);

Sen bunu burada genel çözümdür, kullandığınız dili söz yok: Sen numaralarını "özü" değil, boş bir dize ile sayılar dışında her şeyi değiştirin.

C #, bu gibi görünecektir

string numbers = Regex.Replace(dirtyString, "[^0-9]", "");

Çift haneli sayılar için dikkat etmeliyiz.

/ \ D {1,2} /

ayak ve inç için biraz daha iyi çalışabilir. '2 'Ve maksimum değeri uygun olursa olsun artırdı edilmelidir.