我有以下字符串,我只需匹配[]括号之间的最后七个digets。字符串看起来像这样
[15211Z:2012-09-12]([5202900])
我只需要在([])之间的字符串中匹配5202900,类似的数字可能出现在字符串中的任何位置,所以这样的东西不起作用(\d{7})
我也试过以下正则表达式
([[0-9] {1,7}])
但这包括字符串中的[]
答案 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倍以上。