首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与我以前匹配的东西不匹配的Regex

与我以前匹配的东西不匹配的Regex
EN

Stack Overflow用户
提问于 2014-06-22 00:31:36
回答 1查看 70关注 0票数 1

作为我今天早些时候问的一个问题的一部分,我的目标是验证一辆车在国际象棋符号中所能做的所有动作。

这包括:

  • 字母R
  • 可选的消歧,问题的根源(稍后将详细讨论)
  • 表示捕获的可选x已完成。
  • 推车移动到的正方形(国际象棋中的“文件”列为a-h,行“排名”为1-8)。

不考虑消歧,我们有一个简单的

代码语言:javascript
复制
/Rx?[a-h][1-8]/

Disambiguation

经常发生的情况是,两个钩子可以移动到一个正方形,而另一个可以移动。当发生这种情况时,使用消歧字母或数字。因此,如果在d3和h5上有两个rooks,而h5上的一个移动到d5,那么它就是Rhd5。类似地,当d8上的另一个rook在d1上运行时,d1上的一个rook将被写成R8d3

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

排除罗克歧义的限制是:

  • 任何字母都可以用来消除文件的歧义,
  • 任何数字都可以用于排错,但移动到的平方的数目不能是1或8 (R3d1无效,因为文件优先于级别,应该是Rdd1),并且它不能是与平方数相同的数字(R3d3也无效)。

考虑到以上所述,我构建了以下内容:

代码语言:javascript
复制
/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]),它就不能工作(我无法解释为什么)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-22 01:22:29

您的问题是冗长而密集的,因此我将讨论核心问题,并让您实现该技术:

如何使用分组不匹配我以前匹配的?

我们将一步一步地前进。下面不是一个确切的国际象棋例子,而是一个如何完成你想要的东西的例子。

  1. 比方说,我想要一个与字母a到h相匹配的字符串。
  2. 接下来,我想匹配一个数字和一个破折号。我的准则变成了^[a-h][0-9]-$
  3. 接下来,我想匹配一个字母,但不是我们以前匹配的那个。我的正则表达式变成了^([a-h])[0-9]-(?!\1)[a-h]$,其中([a-h])捕获到组1的第一个字母,而负展望(?!\1)断言下面的内容不是Group 1匹配的内容(也就是说,不是那个字母)。
  4. 让我们为平衡添加一个最后的数字:^([a-h])[0-9]-(?!\1)[a-h][0-9]$。这将与a1-b2相匹配,但不匹配a1-a2

如果你有任何问题,请告诉我。

参考

  • 查找和查找零长度断言
  • 掌握向前看和向后看
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24347111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档