2013-05-20 15 views
5

Ich habe die folgende Zeichenfolge, die ich nur die letzten sieben Diggets zwischen [] Klammern übereinstimmen müssen. Der String sieht wie folgt ausRegex - passt alle zwischen den zweiten Klammern ([])

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

Ich brauche nur 5.202.900 in der Zeichenfolge zwischen ([]), eine ähnliche Anzahl enthalten übereinstimmen erscheinen überall in der Zeichenfolge könnte so etwas wie dieses nicht (\d{7})

arbeiten werde ich auch versucht, die folgende regex

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

aber dies beinhaltet das [] in der Zeichenfolge?

+0

Welchen Regex-Geschmack verwenden Sie? – HamZa

+0

@HamZaDzCyberDeV - (? <= \ [) Mit Regex zusammen mit PHP – Roland

+4

Verwenden '\ d {7} (= \?])' [Demo] (http://regex101.com/r/lC8kA5). – HamZa

Antwort

4

Wenn Sie nur die 7 Ziffern wollen, nicht die Klammern, aber sicherstellen möchten, dass die Ziffern mit Klammern umgeben sind:

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

Zur Info: Dies ist ein positive Vorschau und positive Lookbehind genannt.

Gute Quelle zum Thema: http://www.regular-expressions.info/lookaround.html

+1

lol, du hast die ganze Sache umgedreht, schau dir meinen Kommentar oben an ... – HamZa

+0

@HamZa DzCyberDeV: danke für das Hinzeigen! Ich korrigiere es jetzt ... das ist das Problem wenn man zu schnell schreibt ;-) – ATN

+0

kein Problem, ** + 1 **: D – HamZa

0

Sie können versuchen,

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

Versuchen zu verwenden \(\[(\d{7})\]\) passend, so dass Sie diese ganze regulären Ausdruck übereinstimmen, dann nehmen Sie Gruppe 1, die eine zwischen unescaped Klammern. Sie können {7} durch ein '*' für null oder mehr, + für 1 oder mehrere oder einen genauen Bereich, wie Sie bereits in Ihrer Frage gezeigt haben, ersetzen.

+0

Beachten Sie, dass dies mehr als nur die Zahlen entspricht, aber es macht es einfach, die Nummer abzurufen, ohne den regulären Ausdruck unnötig komplex (z. B. mit positiven Look-Ahead oder Look-Behind). Gruppen sind viel mehr benutzt als diese. –

0

Wenn das erste Muster wie das Ihre aussieht (nicht nur Ziffern), dann sollte diese Arbeit für Sie Zifferngruppe von Klammern wie ([123]) umgeben zu extrahieren:

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

Von Ihren Details scheint Lookbehind und Lookaround gut zu sein. Sie können dies auch ein verwenden:

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

Da das Muster von sieben Ziffer am Ende der Leitung, Motor Bedarf erwartet wird, weniger arbeiten, um das Spiel zu finden.

Hoffe es hilft!

0

Hier ist ein Benchmark (in Perl, aber ich denke, schließen in php die gleiche ist), die Lookarounds Ansatz und Capture-Gruppe vergleicht:

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

Ergebnis:

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

Wie wir kann sehen, Capture ist mehr als 3 mal schneller als Lookaround.