5

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

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

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

我还尝试了以下正则表达式

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

但这包括字符串中的 [] 吗?

4

6 回答 6

5

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

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

仅供参考:这称为积极的前瞻积极的后瞻

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

于 2013-05-20T08:51:06.117 回答
1

尝试 match \(\[(\d{7})\]\),这样你就匹配了整个正则表达式,然后你选择第 1 组,即未转义括号之间的那个。您可以{7}用 '*' 替换零个或多个、+1 个或多个或一个精确范围,就像您在问题中已经显示的那样。

于 2013-05-20T08:49:13.787 回答
0

你可以尝试使用

\[(\d{1,7})\]
于 2013-05-20T08:49:11.733 回答
0

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

\(\[(\d+)\]\)
于 2013-05-20T08:51:49.990 回答
0

从您的详细信息来看,lookbehind 和lookaround 似乎是一个不错的选择。你也可以使用这个:

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

由于七位数的模式预计在行尾,引擎需要更少的工作来找到匹配项。

希望能帮助到你!

于 2013-05-20T10:21:56.637 回答
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 倍以上。

于 2013-05-20T13:27:47.080 回答