gpt4 book ai didi

java - 国际象棋走法 (SAN) 的 RegEx 帮助

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:28 26 4
gpt4 key购买 nike

我正在编写一个应该能够读取和解析国际象棋走法的程序 (SAN)。

以下是可能接受的 Action 示例:

e4
Nf3
Nbd2
Nb1c3
R1a3
d8=Q
exd5
Nbxd2
...

我首先写了NFA ,然后将其转换为语法,然后我将其转换为正则表达式。

按照我的惯例,这就是它的样子

pln + plxln + plnxln + plnln + plln + pxln + lxln=(B+R+Q+N) + lxln + lnxln=(B+R+Q+N) + lnxln + lnln=(B+R+Q+N) + lnln + ln=(B+R+Q+N) + ln + pnxln + pnln

哪里:

p 是集合 {B,R,Q,N,K} 的一个字符(或者认为它是 (B+R+Q+N +K) = [BRQNK]

l[a-h]区间中的一个字符(区分大小写)

n[1-8]区间中的一个数

+ 代表 Union 操作...如果我没看错的话,(B+R+Q+N) 就是 [BRQN]在正则表达式的编程语言中。

= 只是一个普通字符...在国际象棋移动中它用于促销(例如 e8=Q)

x 也是一个普通角色...当您将自己的棋子移动到该位置时,您会拿走对手的棋子。

(/):就像数学一样

我尝试在在线 Java 正则表达式测试器中将第一部分 pln 解析为:[BRQN][a-h][1-8] 并尝试像 NF3。我不太了解如何为复合表达式(如 pln+plxln)做联合……还有我如何标记正则表达式的一部分,以便在检测到它时,我得到所有信息?我试图阅读有关它的文档,但没有弄明白。

有什么建议吗?

最佳答案

符号中的 + 是正则表达式中的 | 。所以你可以使用正则表达式

[BRQNK][a-h][1-8]|[BRQNK][a-h]x[a-h][1-8]|[BRQNK][a-h][1-8]x[a-h][1-8]|[BRQNK][a-h][1-8][a-h][1-8]|[BRQNK][a-h][a-h][1-8]|[BRQNK]x[a-h][1-8]|[a-h]x[a-h][1-8]=(B+R+Q+N)|[a-h]x[a-h][1-8]|[a-h][1-8]x[a-h][1-8]=(B+R+Q+N)|[a-h][1-8]x[a-h][1-8]|[a-h][1-8][a-h][1-8]=(B+R+Q+N)|[a-h][1-8][a-h][1-8]|[a-h][1-8]=(B+R+Q+N)|[a-h][1-8]|[BRQNK][1-8]x[a-h][1-8]|[BRQNK][1-8][a-h][1-8]

这显然有点难看。我可以想到 2 种可能的方法让它变得更好:

  • COMMENTS标志,您可以添加空格。
  • 以更好的方式将各种可能性结合在一起。例如,[BRQNK][a-h]x[a-h][1-8]|[BRQNK][a-h][1-8]x[a-h][1-8]可以重写为[BRQNK][a-h][1-8]?x[a-h][1-8]

我还知道另一个在 Java 中不可用的改进。 (也许不是很多语言,但你可以在 Perl 中做到这一点。)子表达式 (?1)(同样是 (?2) 等)有点像 \1,除了它不匹配匹配第一个捕获组的确切字符串,它匹配任何可能匹配该捕获组的字符串。也就是说,相当于把捕获组又写出来了。因此,您可以(在 Perl 中)将第一个 [BRQNK] 替换为 ([BRQNK]),然后将所有后续出现的替换为 (?1).

关于java - 国际象棋走法 (SAN) 的 RegEx 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40007937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com