2013-05-20 19 views
5

Mam następujący ciąg, który muszę dopasować tylko siedem ostatnich cyfr między nawiasami []. Ciąg wygląda następującoRegex - pasujący do drugiego zestawu nawiasów klamrowych ([])

[15211Z: 2012-09-12] ([5202900])

tylko trzeba dopasować 5202900 w ciągu zawartej pomiędzy ([]), podobnej liczby może pojawić się w dowolnym miejscu w ciągu więc coś takiego nie będzie działać (\d{7})

próbowałem również następujące regex

([0-9] {[1,7]})

ale obejmuje to ciąg znaków []?

+0

Jakiego smaku regex używasz? – HamZa

+0

@HamZaDzCyberDeV - Używanie regex razem z PHP – Roland

+4

Użyj '(? <= \ [) \ D {7} (? = \])', [Demo] (http://regex101.com/r/lC8kA5). – HamZa

Odpowiedz

4

Jeśli chcesz tylko 7 cyfr, a nie uchwyty, ale chcesz, aby upewnić się, że cyfry są otoczone nawiasami:

(?<=\[)\d{7}(?=\]) 

FYI: To się nazywa pozytywny uprzedzona i pozytywny lookbehind.

Dobrym źródłem na temat: http://www.regular-expressions.info/lookaround.html

+1

lol, wszystko przewróciłeś, spójrz na mój komentarz powyżej ... – HamZa

+0

@HamZa DzCyberDeV: dzięki za wskazanie tego! Poprawiłem to teraz ... to jest problem, kiedy piszę zbyt szybko ;-) – ATN

+0

nie ma problemu, ** + 1 **: D – HamZa

0

Można spróbować użyć

\[(\d{1,7})\] 
1

Spróbuj dopasowanie \(\[(\d{7})\]\), więc pasuje do tego całego wyrażenia regularnego, a potem wziąć grupę 1, jedną pomiędzy Niecytowany nawiasach. Możesz zastąpić {7} "*" za zero lub więcej, + za 1 lub więcej lub dokładny zakres, jaki już pokazałeś w swoim pytaniu.

+0

Pamiętaj, że pasuje to więcej niż liczby, ale ułatwia odzyskanie numeru bez niepotrzebnego skomplikowania wyrażenia regularnego (np. za pomocą pozytywnego spojrzenia z wyprzedzeniem lub niezadowolenia). Grupy są znacznie częściej używane niż te. –

0

Jeśli pierwszy wzór wygląda ofertowe (nie tylko cyfr), a następnie to powinno działać, aby wyodrębnić grupę cyfr otoczony nawiasami jak ([123]):

\(\[(\d+)\]\) 
0

Z twoich danych wynika, że ​​lookbehind i lookaround są dobre. Można również korzystać z tego jeden:

(\d{7})\]\)$ 

Ponieważ oczekuje się, że wzór z siedmiu cyfr na końcu konieczności linia, silnik pracować mniej, aby wybrać mecz.

Mam nadzieję, że pomoże!

0

Tutaj jest punktem odniesienia (w Perlu, ale myślę, że jest blisko samo w php), który porównuje podejście lookaround i grupę przechwytywania:

use Benchmark qw(:all); 

my $str = q/[15211Z: 2012-09-12] ([5202900])/; 
my $count = -3; 
cmpthese($count, { 
     'lookaround' => sub { 
      $str =~ /(?<=\[)\d{7}(?=\])/; 
     }, 
     'capture group' => sub { 
      $str =~ /\[(\d{7})\]/; 
     }, 
    }); 

wynik:

    Rate lookaround capture group 
lookaround 274914/s   --   -70% 
capture group 931043/s   239%   -- 

jak my widać, przechwytywanie jest ponad 3 razy szybsze niż obejrzenie.

Powiązane problemy