2015-06-19 3 views
2

Когда я использую это регулярное выражение: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, 16, 127) путем легкого .* в начале (для простоты)?

+0

Почему не только '\ D (\ d +) \ wav'.? У вас нет '. *' В начале, но это все еще довольно просто. – Teepeemm

ответ

2

Вы должны использовать границы слов и якорь $:

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

Это происходит потому, что .* жаден и без \b он соответствует больше, чем нужно.

.* не требуется, но если вы действительно должны использовать его тогда:

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

RegEx Demo


Update: на основе отредактированной вопрос, где нет границы слова до того числа, вы могут использоваться:

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

т. Е. Сделать .*? не жадным.

RegEx Demo2

+0

Спасибо @anubhava! Я только немного отредактировал вопрос (извините за это), потому что обычно у меня нет пробелов перед номерами. Как решить в этом случае? См. Https://regex101.com/r/aS9hR0/9 – Basj

+0

Вы можете использовать '. *? (? P \ d +) \. Wav $' [Вот демонстрация] (https://regex101.com/r/ aS9hR0/10) – anubhava

+1

Waw, спасибо! Я узнал разницу между '. *' (Жадным) и '. *?' (Ленивым). – Basj

0

Вам не нужно .* вообще, так как он не имеет абсолютно никакого влияния на то, что матчи. И, как заявила @anubhava, это жадно, поэтому он потребляет некоторые цифры, которые вы хотите сопоставить.

Просто упростить его к этому:

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

+0

На самом деле, я определяю «формат файла определения набора аудиоданных» (пользователи, безусловно, не знакомы с регулярным выражением), и я хочу, чтобы, если пользователь вводит '*% notename.wav', тогда это преобразуется в регулярное выражение, которое найдут правильные файлы, такие как '[ASR10] CHR Huge Ahhs14.wav' .... Вот почему я хотел, чтобы люди могли использовать' *% notename.wav' – Basj

Смежные вопросы