正则表达式解析MIDI音符名称的建议?

时间:2014-02-13 08:53:40

标签: objective-c regex 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,这是错误的。

编辑:当然这也接受像-8这样的错误八度,但我可以在比赛后过滤它们。

这是Objective-C中项目的一部分,它使用ICU regex风格。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

这将解决几个问题。首先,因为我们在正则表达式的末尾添加$,它将在字符串的末尾停止(这会阻止A10,因为我们恰好匹配一个数字)。然后,段

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

将取1到2之间的负值(并且不会从(?:...)捕获两次),否则它将采用0-8的原始范围。