gpt4 book ai didi

java - 单独的正则表达式匹配,但它们的并集不匹配

转载 作者:行者123 更新时间:2023-12-01 05:20:02 25 4
gpt4 key购买 nike

出于学术目的,我们的核心团队(我和一个 friend )正在用 Java 编写一个基于图 block 的游戏。为了使用这些图 block ,我们获得了一个配置文件,其中包含甲板上所有图 block 的字符串表示形式,每行一次。以下是一些示例:

N=N S=C O=C E=N NS=0 NE=0 NO=0 OE=0 SE=0 SO=1
N=S S=S O=S E=S NS=0 NE=0 NO=0 OE=0 SE=0 SO=0

在上述表示中,N、S、O 和 E 映射到北、南、东和西的基点,而前四个分配的右侧成员映射到道路 (S)、城市 (C) 和田野(N)。以下六组表示两点之间是否存在链接。例如,SO=1 表示南边和西边相连。

我们的第一个想法是使用标准 Java 库提供的 Pattern 类,用正则表达式解析这些行。我的队友编写了一段代码来为整个字符串生成模式,组装较小的模式来指示某些枚举的可能值(以前的位置包含基点, Assets 类型包含道路或城市等结构)。我不会粘贴生成的代码,因为它非常消耗空间并且不太优雅。不过,我可以保证这是正确的。

在继续之前,我想指出,tile 字符串实际上由两个主要部分组成:边框规范(即前 4 个分配)和链接规范(后 6 个)。因此,我们有两个解析器。第一个能够解析“N=N S=C O=C E=N”等字符串,第二个能够解析“NS=0 NE=0 NO=0 OE=0 SE=0 SO=1”。他们的模式是正确的。我们对它们进行了彻底的测试,所有测试都顺利顺利通过。

现在问题来了。由于图 block 字符串始终由第一部分和第二部分组成,因此我们为整个字符串创建了模式,只需附加第一个部分和第二个部分的模式,用\s+ 分隔它们并将它们包围起来带括号。结果表达式如下:

(N\s*\=\s*(N|S|C)(,(R|B|V|G|N))?\s+S\s*\=\s*(N|S|C)(,(R|B|V|G|N))?\s+O\s*\=\s*(N|S|C)(,(R|B|V|G|N))?\s+E\s*\=\s*(N|S|C)(,(R|B|V|G|N))?)\s+(NS\s*\=\s*(0|1)\s+NE\s*\=\s*(0|1)\s+NO\s*\=\s*(0|1)\s+OE\s*\=\s*(0|1)\s+SE\s*\=\s*(0|1)\s+SO\s*\=\s*(0|1))

我知道它看起来很糟糕,但它是编译时结果。尽管如此,我们还是对一些字符串进行了测试,就像我上面发布的那些字符串一样,结果发现它不匹配,尽管单个模式匹配。我们尝试在在线模拟器上运行它,例如 this并且完美匹配。我们不知道如何使其匹配。有什么想法吗?

一些代码:

public Tile from(String tileString) {
Matcher matcher = pattern.matcher(tileString);

return new InnerTile(
tileBorderBuilder.from(matcher.group(1)),
tileLinkageBuilder.from(matcher.group(14)));
}

tileBorderBuilder.from 解析第一部分并返回一个 TileBorder 对象。 tileLinkageBuilder.from 执行相同的操作并返回一个 TileLinkage 对象。它抛出异常:“未找到匹配项”。

P.S.:我们正在使用 Java SE 1.6 或 Open-JDK6(两者都失败)。

最佳答案

要调试此类问题,请从更简单的正则表达式开始并从那里构建,即尝试匹配

 N=N
N=N S=C
...
N=N S=C O=C E=N NS=0 NE=0 NO=0 OE=0 SE=0 SO=1

(相应地缩短正则表达式)。这将帮助您确定正则表达式中出现问题的位置。

也就是说,我建议使用此正则表达式解析配置:

\s*([^\s=]+)\s*=\s*(\S)

将输入分成几行,然后将其重复应用于每一行以读取每个“单词”。

这在 Java 方面需要付出更多努力,但它可以检查正则表达式,并使您的代码易于阅读、理解和扩展......因为几天后,您将添加另一个图 block 或新选项-- 一个月后,正则表达式将掌控你的生活。

关于java - 单独的正则表达式匹配,但它们的并集不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10553871/

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