regex FEN易位状态的正则表达式?

mzmfm0qo  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(110)

FEN(Forsyth-Edwards Notation)格式要求将象棋游戏的易位状态记录为按顺序的字符KQkq的序列。任何字符都可以省略,但如果不存在,则-将代替它。
看起来这应该很容易创建一个正则表达式。但是我已经在网上搜索了很多,我还没有看到一个正确的正则表达式。
我已经看到-|K?Q?k?q,但这是不正确的,因为它不匹配KQk,这是有效的。我已经看到-|[K|Q|k|q]{1,4}-|[KQkq]{1,4},但这些是不正确的,因为它们允许重复字符和乱序。
可以简单地列出所有序列,16用破折号。但那一点都不好玩。
你能建立一个符合规则的正则表达式吗?谢谢!

**编辑:**解决雅各布斯先生的评论。 谢谢。我可以详细说明,我测试了给出的示例,并确定了Swift/Xcode 14的不足之处。我正在寻找一个解决方案与沼泽标准正则表达式。我可以用更多的Swift代码在算法上解决这个问题,但我正在寻找一个正则表达式,我可以将其注入到我已经构建的一个更大的正则表达式中,以便在我将其发送到一个已经工作的初始化器之前进行独立的合规性预测试,该初始化器将FEN片段切碎并构建游戏位置。这将有助于确保错误的输入不会使我的代码崩溃。

tsm1rwdh

tsm1rwdh1#

第一个正则表达式的想法是最接近你所需要的。q也应该是可选的。此外,还应:

  • ^$锚点,用于指示周围不应有其他字符
  • 检查输入是否为空。例如,您可以要求除非输入是-,否则输入的开始应该表示一个单词中断。这可以通过\b完成

所以:

^(-|\bK?Q?k?q?)$

参见regex101
\b确保有断字。在这个正则表达式中,它在输入字符串的第一个位置进行测试,因此实际上意味着它要求第一个字符是字母数字。这足以确保输入不为空。\b不匹配空字符串。

相关问题