2014-02-13 6 views
0

Я пытаюсь создать регулярное выражение для извлечения имен MIDI-заметок и октав из строки, чтобы в конечном итоге превратить результат в фактическое значение ноты MIDI.Предложения для регулярного выражения для разбора имен MIDI-заметок?

названия MIDI ноты являются дискретный диапазон от C-2 до G8, что соответствует 0 ... 127, так что:

0 = C-2 
1 = C#-2 
2 = D-2 
... 
125 = F8 
126 = F#8 
127 = G8 

Вот что я сейчас:

^([CDEFGAB]#?)(-?[0-8])

Это выражение соответствует всем действительным нотам MIDI с группами захвата и отбрасывает очевидные, такие как K9. Проблема в том, что он также соответствует фиктивному вводу, например A10, и дает мне примечание = A октав = 1, что неверно.

EDIT: Конечно, это также принимает неправильные октавы, такие как -8, но я могу отфильтровать их после матча.

Это часть проекта в Objective-C, который использует аромат ICU regex.

Любые предложения?

ответ

1

^([CDEFGAB]#?)((?:-[1-2])|[0-8])$

Это позволит устранить ряд проблем. Во-первых, поскольку мы добавляем $ в конец регулярного выражения, он останавливается в конце строки (это предотвращает A10, поскольку мы точно соответствуем одной цифре). Затем сегмент

((?:-[1-2])|[0-8])

либо принять отрицательное значение между 1 и 2 (а не захватить его в два раза, от (?:...)), или она примет первоначальный диапазон положительных 0-8.

+0

К сожалению. Исправлено это в одном, но не в другом. Фиксация сейчас. Хорошо поймал! – gregkow

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