Ruby 与我以前匹配的东西不匹配的正则表达式

Ruby 与我以前匹配的东西不匹配的正则表达式,ruby,regex,chess,Ruby,Regex,Chess,作为游戏的一部分,我的目标是验证一辆车在国际象棋符号中可以做出的所有动作 这包括: 字母R 可选的消歧,问题的根源(稍后详细讨论) 可选的x表示已进行捕获 车移动到的正方形(象棋中的列[“文件”字母为a-h,行[“等级”]编号为1-8) 不考虑歧义消除,我们有简单的 /Rx?[a-h][1-8]/ 消歧 通常情况下,两辆车可以移动到一个正方形,一辆可以。发生这种情况时,将使用消除歧义的字母或数字。因此,如果d3和h5上有两辆车,h5上的一辆车移动到d5,则写入Rhd5。类似地,当另一辆车在

作为游戏的一部分,我的目标是验证一辆车在国际象棋符号中可以做出的所有动作

这包括:

  • 字母
    R
  • 可选的消歧,问题的根源(稍后详细讨论)
  • 可选的x表示已进行捕获
  • 车移动到的正方形(象棋中的列[“文件”字母为a-h,行[“等级”]编号为1-8)
不考虑歧义消除,我们有简单的

/Rx?[a-h][1-8]/
消歧

通常情况下,两辆车可以移动到一个正方形,一辆可以。发生这种情况时,将使用消除歧义的字母或数字。因此,如果d3和h5上有两辆车,h5上的一辆车移动到d5,则写入
Rhd5
。类似地,当另一辆车在d1上时,d8上的一辆车移动到d3被写入
R8d3

文件优先于等级。在第一个示例中,如果d3上的rook移动到d5,则可以将其消歧为
R3d5
Rdd5
。只有后者是正确的

rook消歧的限制是:

  • 任何字母均可用于文件消歧,以及
  • 任何数字都可以用于秩消歧,但移动到的平方数不得为1或8(
    R3d1
    无效,因为文件优先于秩,应为
    Rdd1
    ),且不得与平方数相同(
    R3d3
    也无效)
基于上述考虑,我构建了以下内容:

/R([a-h]?x?[a-h][1-8]|([1-8])x?[a-h][2-7&&[^\1]])/
问题在于最后几个字符,
[2-7&&[^\1]]
。Ruby从字面上解释
[^\1]
,即除了
\
1
之外的所有字符。如果我尝试将\1放在括号外(
[2-7&&[^]\1]
),Ruby会抱怨字符类没有元素。如果我使用了一个永远不会出现的任意占位符,比如“z”(
[2-7&&[^z]\1]
),它就不起作用(我无法解释原因)


那么,我如何使用分组来不匹配我以前匹配的内容呢?

您的问题又长又密集,因此我将解决核心问题,并让您实施该技术:

如何使用分组来不匹配以前匹配的内容

我们将一步一步地进行。下面不是一个确切的国际象棋示例,而是一个如何实现您的目标的示例

  • 假设我想要一个匹配字母a到h的字符串。我的正则表达式是
    ^[a-h]$
  • 接下来我想匹配一个数字和一个破折号。我的正则表达式变成
    ^[a-h][0-9]-$
  • 接下来我想匹配一封信,但不是我们之前匹配的那封。我的正则表达式变为
    ^([a-h])[0-9]-(?!\1)[a-h]$
    ,其中
    ([a-h])
    捕获到组1的第一个字母,而负前瞻
    (?!\1)
    断言下面的内容不是组1匹配的内容(即,它不是该字母)
  • 让我们为余额添加最后一个数字:
    ^([a-h])[0-9]-(?!\1)[a-h][0-9]$
    。这将匹配
    a1-b2
    ,但不匹配
    a1-a2
  • 如果你有任何问题,请告诉我

    参考


    虽然
    ([1-8])x?[a-h](?!\1)[2-7]
    本身可以工作,但完整的正则表达式
    /R([a-h]?x?[a-h][1-8]|([1-8])x?[a-h](?!\1)[2-7])/
    R5d5
    不正确匹配。有没有办法让
    |
    ?在您的正则表达式中,对于R5d5,组1是
    5d5
    ,组2是
    5
    。不知道你想做什么,但这三种方法中的任何一种都可以解决问题:(1)将
    \1
    更改为
    \2
    或(2)删除外圆括号(你没有使用它们)或(3)使用
    使它们不捕获(?:
    )…可能会离开计算机一段时间,但请告诉我如何操作