- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在编写一个应该能够读取和解析国际象棋走法的程序 (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 在遇到包含超过 100 个文件的目录时从任何单个 listdir 中断。基本上,我正在搜索 (.TXT) 文件,但我想避免使用包含大型 DPX 图像序列
我正在尝试遍历列表(例如 sql 行)并为每一行触发例程。问题是传递给函数的值不会在运行时进行评估,因此根据函数执行所需的时间,它可能会使用下一行中的任何值而不是当前行。 我知道我可以在普通函数中提取
我需要以毫秒为单位的时间来处理大量事务,因此我想要正确且快速的东西。下面的工作会做得最好吗? : iMilli := int((time.Nanoseconds() % 1e6) / 1e3
我有以下目录/文件设置(已简化): Ce +---top.txt +---X0.0 | | | +---Y0.0 | | | | |
我遇到了类似的问题: Connecting to Redis To Go with PHP 基本上,我在 redis 中有这个 uri: redis://myusername:foopassword@
我阅读了下面的主题 Go: multiple value in single-value context 但我不明白这个解释在我的案例中。可能是因为我想使用 interface 在下面的情况下,我得到
我有一个模板,我想使用 text/template 评估各个字段包裹。我很难弄清楚评估应该如何工作,因为下面的代码似乎失败了。模板包是否足够强大以处理此类评估? type something stru
我编写了简单的服务器程序来从客户端接收数据。我有点不明白有时我从函数中得到错误 read tcp4 IP:PORT i/o timeoutint, err := conn.Read([]byte) 未
我只需要解码和更新 json 对象的特定值。问题是我不知道对象的完整结构。 encoding/json 包“忽略”/截断结构中未提供的字段,因此在编码时这些字段将丢失。 我想知道是否可以只解码我知道的
我正在尝试使用带有 C++ 目标的 ANTLR4 来实现 TSql 解析器。我抓取了语法文件 here .该jar用于制作相应的源文件(因冲突将TSqlParser.cpp中的NULL全部改为null
我在 win7 中使用 python 3.3.3 - 我只想列出网络目录中的所有文件。 import os for root, dirs, files in os.walk("X:\\network\
当我运行 go 脚本 ( go run example.go ) 时出现此错误 /home/travis/.gvm/gos/go1.1.2/src/pkg/github.com/user/exampl
我正在尝试通过 gmail API 发送电子邮件使用 Go但我发现文档非常有缺陷/令人困惑。这一次我看不到收据字段和电子邮件正文。 我不需要上传任何东西,所以我找到了 Simple upload ,
本人是一名专业的windows/.Net开发者,一直在慢慢学习rails/ruby/python/etc。在我有空的时候。在过去 8 年左右的时间里,我也一直在使用各种 Linux 发行版。然而,有一
我想知道是否可以使用 std http 来响应 http 请求打包并仍然保持 go 例程事件(例如运行任务密集型任务)。用例是我需要接收一个 http 请求,然后在几分钟后回调该服务 最佳答案 只需从
我想知道关于指针的最佳实践是什么。我应该在结构上还是在其字段上定义它们。我虽然定义一个指向结构本身的指针是有意义的,但这里有一个我觉得很有趣的例子。如果所有字段都是指针,为什么我不应该使用指向整个结构
我是一名优秀的程序员,十分优秀!