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

标签 java regex

我正在编写一个应该能够读取和解析国际象棋走法的程序 (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/

相关文章:

python - [^.]* 在正则表达式中是什么意思?

java - 在这种情况下如何避免 ArrayIndexOutOfBoundsException?

java - 类声明范围不明确

java - 如何在并发环境中设计到数据库的http连接(是否为静态变量)

javascript - 如何分析无限嵌套的公式?

Java正则表达式匹配元组

Python Pandas : How to split a column on left parenthesis and remove numbers from a column of dataframe

python - 如何创建包含变量和注释的正则表达式?

java - 从 Java Web 应用程序中使用 Mailjet.com 的 API

java - 如何检查文件名是否已经存在?