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 может следовать буква, которая идет до или после них».