2013-05-20 19 views
5

Ho la seguente stringa che devo abbinare solo agli ultimi sette cifre tra parentesi []. La stringa simile a questaRegex - corrispondente a tutto tra il secondo set di parentesi ([])

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

ho solo bisogno di corrispondere 5.202.900 nella stringa contenuta tra ([]), un numero simile potrebbe apparire in qualsiasi punto della stringa in modo qualcosa come questo non funzionerà (\d{7})

ho anche provato la seguente espressione regolare

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

ma questo include [] nella stringa?

+0

Che sapore di regex stai usando? – HamZa

+0

@HamZaDzCyberDeV - Uso della regex insieme a PHP – Roland

+4

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

risposta

4

Se si desidera solo le 7 cifre, non le staffe, ma vuole fare in modo che le cifre sono circondati di staffe:

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

FYI: questo è chiamato un lookahead positivo e lookbehind positiva.

Buona fonte sul tema: http://www.regular-expressions.info/lookaround.html

+1

lol, hai capovolto il tutto, dai un'occhiata al mio commento sopra ... – HamZa

+0

@HamZa DzCyberDeV: grazie per avermelo fatto notare! L'ho corretto ora ... questo è il problema quando scrivo troppo velocemente ;-) – ATN

+0

nessun problema, ** + 1 **: D – HamZa

0

Si può provare a utilizzare

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

Prova corrispondenza \(\[(\d{7})\]\), in modo da corrispondere a tutta questa espressione regolare, poi si prende gruppo 1, quello tra parentesi escape. Puoi sostituire {7} con un '*' per zero o più, + per 1 o più o un intervallo preciso come hai già mostrato nella tua domanda.

+0

Nota che questo corrisponde a più di un semplice numero, ma semplifica il recupero del numero senza rendere l'espressione regolare inutilmente complessa (ad esempio utilizzando look-ahead positivo o look-behind). I gruppi sono molto più usati di quelli. –

0

Se il primo modello sembra come la tua (non solo cifre), allora questo dovrebbe funzionare per voi di estrarre gruppo di cifre circondato da parentesi come ([123]):

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

Dai tuoi dettagli, lookbehind e lookaround sembra essere buono. È inoltre possibile utilizzare questo:

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

Dal momento che il modello di sette cifre è prevista per la fine della linea di necessità, il motore a lavorare di meno, al fine di trovare la corrispondenza.

Spero che aiuti!

0

Ecco un punto di riferimento (in Perl, ma penso che è vicino lo stesso in php) che mette a confronto l'approccio Lookaround e il gruppo di cattura:

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})\]/; 
     }, 
    }); 

risultato:

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

Come abbiamo può vedere, l'acquisizione è più di 3 volte più veloce del lookaround.

Problemi correlati