正则表达式 - 匹配第二组括号([])之间的所有

时间:2013-05-20 08:45:43

标签: php regex

我有以下字符串,我只需匹配[]括号之间的最后七个digets。字符串看起来像这样

  

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

我只需要在([])之间的字符串中匹配5202900,类似的数字可能出现在字符串中的任何位置,所以这样的东西不起作用(\d{7})

我也试过以下正则表达式

  

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

但这包括字符串中的[]

6 个答案:

答案 0 :(得分:5)

如果您只想要7位数字,而不是括号,但要确保数字用括号括起来:

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

仅供参考:这称为正向前瞻正向后视

关于该主题的良好来源:http://www.regular-expressions.info/lookaround.html

答案 1 :(得分:1)

尝试匹配\(\[(\d{7})\]\),以便匹配整个正则表达式,然后取第1组,即非转义括号之间的组。您可以将{7}替换为'*'表示零或更多,+表示1或更多,或者您已在问题中显示的精确范围。

答案 2 :(得分:0)

您可以尝试使用

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

答案 3 :(得分:0)

如果第一个模式看起来像你的(不仅仅是数字),那么这应该可以提取括号括起来的数字组,如([123])

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

答案 4 :(得分:0)

根据您的详细信息,lookbehind和lookaround似乎很好。你也可以使用这个:

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

由于预计在行尾有七位数的模式,因此引擎需要更少的工作才能找到匹配。

希望它有所帮助!

答案 5 :(得分: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%            --

正如我们所看到的,捕获速度比环视速度快3倍以上。

相关问题