2013-05-20 69 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倍以上。