作为我今天早些时候问的一个问题的一部分,我的目标是验证一辆车在国际象棋符号中所能做的所有动作。
这包括:
R不考虑消歧,我们有一个简单的
/Rx?[a-h][1-8]/Disambiguation
经常发生的情况是,两个钩子可以移动到一个正方形,而另一个可以移动。当发生这种情况时,使用消歧字母或数字。因此,如果在d3和h5上有两个rooks,而h5上的一个移动到d5,那么它就是Rhd5。类似地,当d8上的另一个rook在d1上运行时,d1上的一个rook将被写成R8d3。
档案优先于级别。在第一个示例中,如果d3上的rook移动到d5,则可以将其消歧为R3d5或Rdd5。只有后者是正确的。
排除罗克歧义的限制是:
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]),它就不能工作(我无法解释为什么)
那么,我如何使用分组来不匹配我以前匹配的呢?
发布于 2014-06-22 01:22:29
您的问题是冗长而密集的,因此我将讨论核心问题,并让您实现该技术:
如何使用分组不匹配我以前匹配的?
我们将一步一步地前进。下面不是一个确切的国际象棋例子,而是一个如何完成你想要的东西的例子。
^[a-h][0-9]-$^([a-h])[0-9]-(?!\1)[a-h]$,其中([a-h])捕获到组1的第一个字母,而负展望(?!\1)断言下面的内容不是Group 1匹配的内容(也就是说,不是那个字母)。^([a-h])[0-9]-(?!\1)[a-h][0-9]$。这将与a1-b2相匹配,但不匹配a1-a2。如果你有任何问题,请告诉我。
参考
https://stackoverflow.com/questions/24347111
复制相似问题