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][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)使用使它们不捕获(?:
)…可能会离开计算机一段时间,但请告诉我如何操作