正则表达式根据之前匹配的内容匹配

我正在尝试编写一个正则表达式来validation代数国际象棋符号中的移动。 这是我到目前为止所拥有的:

/ OO(-O)? # Castling |[KQRBN]x?[ah][1-8]\+? # Most normal moves and captures / 

我丢失的地方是典当促销。

骑士,主教或中心棋子只能通过捕获来提升它开始的文件或任何一方的文件。 根据是否在a-或h-文件上,可以通过直线移动或捕获到一侧来促进车辆典当。 所以像

 /[ah](x[ah])?[18]=[QRBN]\+?/ 

不起作用,因为fxh8不是有效的移动(只有fxe8和fxg8)。 我可以走很长的路

 /(a(xb)?|h(xg)?|b(x[ac])?.../ # insert 5 more files in place of the ... 

但那不是很有效率。 我想使用分组,这样我就可以做车,以及其他一切。 我有这样的想法:

 /([bg])(x(\1±1))?/ 

表示“字母b到g之后可能跟在它们之前或之后的字母”。

使用替换来匹配相邻字母并不难,但由于正则表达式中没有字符算术,因此您将找不到任何紧凑的字符。

有人因为你的困境而对同样的问题表示同情。

漫漫长路是唯一的出路。