这里首先给出一个网站: 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]?)?

这里也就不做缩进了,直接用最开始提到的网站来可视化展示。

chord-regex

这样, 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]?)?

chord-regex-add