ruby - 正则表达式根据之前匹配的内容匹配某些内容

标签 ruby regex chess

我正在尝试编写一个正则表达式来验证 algebraic chess notation 中的移动.这是我到目前为止所拥有的:

/
    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 ...

但这不是很有效。我想使用分组,这样我就可以做 rook-pawn 和其他所有事情。我有这样的想法:

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

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

最佳答案

使用交替匹配相邻字母并不难,但您不会找到任何紧凑的东西,因为正则表达式中没有字符算术。

有人刚刚发布了 similar question出于对你困境的同情。

路漫漫其修远兮

关于ruby - 正则表达式根据之前匹配的内容匹配某些内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24344875/

相关文章:

jquery - 如何在 Rails 4 中动态加载数据

ruby-on-rails - 当在rails中使用 'build'命令时,在保存之前,我的zombie.weapons数组中有2个武器,但是zombie.weapons.count = 0

javascript - Chrome 控制台中的 regExp 奇怪 react

java - 将字符串拆分为数组字符串,名称位于第一个位置

c - 如何有效地编码/解码压缩的位置描述?

java - 如何保存 JPanel 的特定部分?

javascript - 制作处理密集型网页代码(国际象棋引擎)

ruby - 是否有任何理由拥有多个全局可访问的 Mutex?

Ubuntu 无法识别 Ruby 1.9.1

regex - 在 Resharper 中使用 Regex 编写自定义模式