和弦记号与正则表达式
这里首先给出一个网站: https://www.debuggex.com/
有了它的帮助,正则表达式可以更直观一些。
和弦表记
一般来说,三个音及以上的音的堆叠构成和弦。三个音三和弦、四个音七和弦,再往上可得到九、十一、十三……一般以根音 + 性质 + 外加音 + 转位的方式表记。
三和弦
一般来说,三和弦有以下四种。
- 大三和弦,一般不带符号,或者记为 M,maj
- 小三和弦,一般记作 m,也记作 min
- 增三和弦,一般记作 +,aug
- 减三和弦,一般记作 o,dim
七和弦
七和弦由在三和弦上加七度音构成,一般来说有以下几种。
古典音乐常见的有四种。
- 大小七和弦(属七和弦),大三和弦 + 小七度,一般记作 7
- 小小七和弦(小七和弦),小三和弦 + 小七度,一般记作 m7
- 减小七和弦(半减七和弦),减三和弦 + 小七度,一般记作 ø7 (也有记法记作小七降五)
- 减减七和弦(减七和弦),减三和弦 + 减七度,一般记作 o7,dim7
其他的还有
- 大大七和弦(大七和弦),大三和弦 + 大七度,一般记作 maj7,M7
- 小大七和弦,小三和弦 + 大七度,一般记作 mM7,mmaj7
- 增小七和弦(增七和弦),增三和弦 + 小七度,一般记作 +7,aug7
- 增大七和弦,增三和弦 + 大七度,一般记作 +M7
七和弦中再往上堆叠九度音、十一度音、十三度音即可得到九、十一、十三和弦。
其他
七和弦还有很多变化形,这里就不再列举。
和弦中可以外加音,一般用 add 符号表示,例如 add2,add6 (也可只记作 6)等。
挂留和弦由改变三度音得到,一般用 sus 符号表示,一般有挂二和弦(sus2)、挂四和弦(sus4)。
和弦中,如果将低音变为其中其他的组成音即转位。三和弦有两种转位,以三度音为低音的是第一转位,称为六和弦,以五度音为低音的是第二转位,成为四六和弦;七和弦有三种转位,分别被称为五六和弦、三四和弦、二和弦。
正则表达式
用正则表达式匹配和弦记号,是比较困难的任务,位置不确定、表记法不一致、书写方式不一致等等。所以首先限制如下:只记录三和弦,七和弦,属九、十一、十三和弦以及挂留和弦,不记录如 add6 和弦、小七降九和弦等;其中增、减用 aug、dim 表示,大七度音用 maj7 表示,半减七和弦使用 ø7 表示(7 可省略);不额外记录转位,直接用斜线 + 低音的方式表示;如 C/G。
初次尝试匹配的时候仍然有问题,例如对 Cm、Cmaj7、C、Cmmaj7 进行匹配,若使用 C((m)?(maj7)?) 只能匹配到 Cm ,会产生回溯问题。因此最简单的解决办法是将特例、严格条件放在前即可。
尝试多次正则表达式后如下。
([A-G|a-g][#|b]?)((7|maj7)?sus(2|4)?|ø7?|mmaj7|maj7|m|9|11|13|((aug|dim)?(7|maj7)?)?)/?([A-G|a-g][#|b]?)?
这里也就不做缩进了,直接用最开始提到的网站来可视化展示。

这样, Fmmaj7、Abmaj7sus2、C#dim7/Gb 之类的和弦表记也能匹配成功了。
当然这样的正则表达式还远不能够匹配所有和弦记号,如需扩展,还要解决变化音、外加音的匹配问题。
更新
稍微更新了一下,应用的时候才发现没匹配上 m7……
另外增加了 add6、add9 和弦的匹配。由于特殊原因,这里把 add2 和 add9 视为一类。
正则表达式如下。
([A-G|a-g][#|b]?)((add6|7|maj7)?sus(2|4)?|((m|aug)?add6)|m?maj7|[m|ø]7?|9|11|13|((aug|dim)?(7|maj7|add9)?)?)/?([A-G|a-g][#|b]?)?
