2013-05-20 84 views
5

我有以下字符串,我只需要匹配[]括號之間的最後七個digets。該字符串看起來像正則表達式 - 匹配所有第二組括號([])

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

我只需要包含([])之間的字符串相匹配5202900,類似的數可以在字符串中的任何地方出現這麼像這樣將無法工作(\d{7})

我也試過以下的正則表達式

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

但這包括字符串中的[]嗎?

+0

你用的是什麼正則表達式? – HamZa

+0

@HamZaDzCyber​​DeV - 使用正則表達式和PHP一起使用 – Roland

+4

使用'(?<= \ [)\ d {7}(?= \])',[demo](http://regex101.com/r/lC8kA5)。 – HamZa

回答

4

如果你只是想在7個位數,而不是括號,但要確保數字與括號括起來:

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

FYI:這就是所謂的正向前查找正回顧後

的話題好來源:http://www.regular-expressions.info/lookaround.html

+1

大聲笑,你翻了整個事情,看看我上面的評論... – HamZa

+0

@HamZa DzCyber​​DeV:謝謝你指出了!我現在糾正了這個問題 - 當寫得太快時,這是問題;-) – ATN

+0

沒有問題,** + 1 **:D – HamZa

0

你可以嘗試使用

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

嘗試匹配\(\[(\d{7})\]\),所以你匹配這整個正則表達式,然後你把第1組,轉義括號之間的一個。您可以用'*'代替0或更多,+代替1或更多或精確範圍,就像您已經在您的問題中顯示的那樣。

+0

請注意,這不僅僅與數字相匹配,而且可以很容易地檢索數字,而不會使正則表達式變得不必要的複雜(例如,使用積極的前瞻或後視)。這些組比這些使用得多。 –

0

如果第一圖案看起來像你的(不僅是數字),那麼這應該爲你工作,以提取括號像([123])包圍的數字組:

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

從您的詳細資料看,lookbehind和lookaround似乎是一個好的。您也可以使用這一個:

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

由於七位的格局有望在的線,發動機需要月底才能找到配對的少,工作。

希望它能幫助!

0

這裏是一個標杆(在Perl,但我認爲是在PHP接近相同),其環視方法和捕獲組比較:

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

結果:

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

我們可以看到,捕獲速度比lookaround快3倍以上。