我有以下字符串,我只需要匹配 [] 括号之间的最后七个数字。字符串看起来像这样
[15211Z: 2012-09-12] ([5202900])
我只需要匹配 ([]) 之间包含的字符串中的 5202900,类似的数字可能会出现在字符串中的任何位置,所以这样的事情不会起作用(\d{7})
我还尝试了以下正则表达式
([[0-9]{1,7}])
但这包括字符串中的 [] 吗?
如果您只想要 7 位数字,而不是括号,但要确保数字用括号括起来:
(?<=\[)\d{7}(?=\])
仅供参考:这称为积极的前瞻和积极的后瞻。
关于该主题的良好来源:http ://www.regular-expressions.info/lookaround.html
尝试 match \(\[(\d{7})\]\)
,这样你就匹配了整个正则表达式,然后你选择第 1 组,即未转义括号之间的那个。您可以{7}
用 '*' 替换零个或多个、+
1 个或多个或一个精确范围,就像您在问题中已经显示的那样。
你可以尝试使用
\[(\d{1,7})\]
如果第一个模式看起来像你的(不仅仅是数字),那么这应该适用于你提取括号括起来的一组数字,如([123])
:
\(\[(\d+)\]\)
从您的详细信息来看,lookbehind 和lookaround 似乎是一个不错的选择。你也可以使用这个:
(\d{7})\]\)$
由于七位数的模式预计在行尾,引擎需要更少的工作来找到匹配项。
希望能帮助到你!
这是一个比较环视方法和捕获组的基准(在 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 倍以上。