当我使用这个正则表达式模式时:
.*(?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)?(为简单起见)?
答案 0 :(得分:2)
您应该使用单词边界并锚定$
:
\b(?P<midinote>\d+)\.wav$
这是因为.*
贪婪且没有\b
,所以匹配的数量超过了需要。
.*
不需要,但如果你真的必须使用它,那么:
.*\b(?P<midinote>\d+)\.wav$
更新:根据编辑过的问题,在数字之前没有字边界,您可以使用:
.*?(?P<midinote>\d+)\.wav$
即。让.*?
非贪婪。
答案 1 :(得分:0)
您根本不需要.*
,因为它对匹配的内容完全没有影响。并且,正如@anubhava所说,它很贪婪,所以它消耗了你想要匹配的一些数字。
将其简化为:
(?P<midinote>\d+)\.wav