正则表达式匹配的数字不够

时间:2015-06-19 13:45:59

标签: regex

当我使用这个正则表达式模式时:

.*(?P<midinote>\d+)\.wav

关于这些字符串,这是我得到的:

[ASR10] CHR Huge Ahhs1.wav     => midinote=1 OK
[ASR10] CHR Huge Ahhs2.wav     => midinote=2 OK
[ASR10] CHR Huge Ahhs3.wav     => midinote=3 OK
[ASR10] CHR Huge Ahhs14.wav    => midinote=4 NOT OK
[ASR10] CHR Huge Ahhs15.wav    => midinote=5 NOT OK
[ASR10] CHR Huge Ahhs16.wav    => midinote=6 NOT OK
[ASR10] CHR Huge Ahhs127.wav   => midinote=7 NOT OK

如何通过在开头保持简单.*来捕捉结束数字(1,2,3,14,15,127)?(为简单起见)?

2 个答案:

答案 0 :(得分:2)

您应该使用单词边界并锚定$

\b(?P<midinote>\d+)\.wav$

这是因为.*贪婪且没有\b,所以匹配的数量超过了需要。

.*不需要,但如果你真的必须使用它,那么:

.*\b(?P<midinote>\d+)\.wav$

RegEx Demo

更新:根据编辑过的问题,在数字之前没有字边界,您可以使用:

.*?(?P<midinote>\d+)\.wav$

即。让.*?非贪婪。

RegEx Demo2

答案 1 :(得分:0)

您根本不需要.*,因为它对匹配的内容完全没有影响。并且,正如@anubhava所说,它很贪婪,所以它消耗了你想要匹配的一些数字。

将其简化为:

(?P<midinote>\d+)\.wav