【问题标题】:NSRegularExpression splitting / reparsing a matchNSRegularExpression 拆分/重新解析匹配
【发布时间】:2021-12-15 02:22:32
【问题描述】:

我正在为国际象棋符号制作一个正则表达式,并且有一个特定部分几乎不可能在 1 遍中解析...

符号可以是这样的

5.Nd5e3

这意味着:移动 5,白方将马移动到坐标d5,黑方将兵移动到e3

很像 SVG 或类似的东西,它尽可能简洁,而且你在 pawn 动作中省略了 P。

但是,如果在这种情况下有多个骑士可以移动到d5,您可以指定移动的骑士,可以是等级、文件或两者。含义Nd5e3 也可能意味着,将d5 上的骑士移动到e3

所以每次移动的正则表达式看起来像这样

\([KQNBR])?\([a-h]?[1-8]?)([a-h][1-8])

Piece?,Piece的起始等级?和/或文件?,Piece 的最终等级和文件。

除了说,别无他法

  • 除了最后一步之外,我预计所有人都会有两步走
  • 由于上述原因,它将是5.Nd5e3e3 (这在分段方面是无效的,只是说,除非黑棋玩家在这一步之后辞职,否则你会得到更多的符号)
  • 对于所有表示法,导致 2 个匹配项的匹配拆分可能对除最后一对之外的所有匹配项都是正确的。

我正在寻找一种优雅的方式来遍历这些字符串并让白色和黑色移动,而不仅仅是一次移动。

我目前唯一的想法是先获取坐标,然后检查前面的字符是否有片段符号/缺少,但我是一个正则表达式菜鸟,我希望有一个很好的方法来获取它们,尤其是在 iOS / Swift 中。

【问题讨论】:

  • 也许你可以用 NSScanner 来代替?
  • 我不是专家,但您当前的正则表达式与相反的移动不匹配,即白棋走棋,黑棋走马?并且不支持捕获检查伴侣或检查,还是这是故意的?我对此没有解决方案,但也许一种方法可以是使用 2 或 3 个正则表达式来降低它们的复杂性,然后一个接一个地尝试它们,直到找到匹配为止。
  • 嗨@JoakimDanielson 它实际上会匹配我想要的方式,因为 N 会将 2 个动作分开。 e3Nd5 会因为 e3Nd5 仅在第一步和棋子符号和第二步是棋子移动时才会出现问题。
  • 也许你可以通过检查字符串的长度来确定使用哪种类型的正则表达式来获取一些信息。
  • 是的,我认为这是唯一的方法......因为我期待 2 如果我没有得到一对移动,我可以在坐标上运行并找到周围元素的移动。跨度>

标签: swift regex regex-group nsregularexpression


【解决方案1】:

我认为在一个表达式中是可能的。我不是棋手,所以我阅读Disambiguating moves section in Wikipedia 只是为了理解。

以下正则表达式使用命名的捕获组,但这不是必需的,只是为了方便。

(?<Piece>[KQNBR])(?<StartingFile>[a-h]{0,1})(?<StartingRank>[1-8]{0,1})(?<Destination>[a-h][1-8])

我使用site 对其进行了测试。我在 wiki 中阅读的三种可能情况:

  • Qh4e1

  • Rdf8

  • R1a3

不需要消歧的简单场景也可以:

我认为所有的可能性都被tis表达式覆盖了。

【讨论】:

  • 嘿,谢谢,命名的捕获组将来可能对我非常有用..但是它不能解决问题。将我的问题应用于您的示例。 Qh4e1 应该是 2 个匹配项。 Qh4 组块 Q 和组目标 h4 和组目标 e1 因为一对中有 2 个动作。
猜你喜欢
  • 2012-02-15
  • 2012-05-18
  • 2013-11-09
  • 2012-03-01
  • 2014-04-21
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多