Regex, чтобы соответствовать чему-то на основе того, что было найдено ранее

Я пытаюсь написать регулярное выражение для проверки ходов валгебраические шахматные обозначения, Вот что у меня так далеко:

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

Где я заблудился, это продвижение пешки.

Рыцарь, слон или пешка в центре могут продвигаться только по файлу, с которого он начинается, или по файлу с любой стороны посредством захвата. Пешка ладьи может продвигаться, двигаясь прямо или захватывая одну сторону, в зависимости от того, находится ли она на a- или h-файлах. Так что-то вроде

/[a-h](x[a-h])?[18]=[QRBN]\+?/

не работает, потому что fxh8 не является допустимым ходом (только fxe8 и fxg8). Я мог бы пройти длинный путь с

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

но это не очень эффективно. Я хочу использовать группировку, чтобы я мог делать пешки-ладьи и все остальное. Я имею в виду что-то вроде этого:

/([b-g])(x(\1±1))?/

Для обозначения «за буквами от b до g может следовать буква, которая идет до или после них».

Ответы на вопрос(1)

Ваш ответ на вопрос