我正在尝试设计一个正则表达式,从字符串中提取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风格。
有什么建议吗?
答案 0 :(得分:1)
^([CDEFGAB]#?)((?:-[1-2])|[0-8])$
这将解决几个问题。首先,因为我们在正则表达式的末尾添加$,它将在字符串的末尾停止(这会阻止A10,因为我们恰好匹配一个数字)。然后,段
((?:-[1-2])|[0-8])
将取1到2之间的负值(并且不会从(?:...)
捕获两次),否则它将采用0-8的原始范围。