【发布时间】:2021-02-18 15:38:39
【问题描述】:
我有一个类似于以下内容的文件:
background_color{ 104, 184, 104 }
tile_pattern{
id = "1",
ground = "empty",
default_layer = 2,
x = 0,
y = 0,
width = 8,
height = 16,
repeat_mode = "none",
}
tile_pattern{
id = "999",
ground = "traversable",
default_layer = 0,
x = 40,
y = 1000,
width = 8,
height = 8,
}
tile_pattern{
id = "abyss_bridge",
ground = "traversable",
default_layer = 0,
x = 280,
y = 448,
width = 16,
height = 16,
}
tile_pattern{
id = "acid",
ground = "prickles",
default_layer = 0,
x = { 712, 728, 744 },
y = { 384, 384, 384 },
width = 16,
height = 16,
}
tile_pattern{
id = "lava",
ground = "lava",
default_layer = 0,
x = { 696, 696, 696, 696 },
y = { 368, 384, 400, 384 },
width = 16,
height = 16,
}
tile_pattern{
id = "hole_parallax.1-1",
ground = "hole",
default_layer = 0,
x = 312,
y = 224,
width = 16,
height = 16,
scrolling = "self",
}
tile_pattern{
id = "air_duct.1",
ground = "wall",
default_layer = 0,
x = 880,
y = 48,
width = 32,
height = 24,
repeat_mode = "none",
}
border_set{
id = "wall_hole",
inner = true,
pattern_0 = "wall_hole.4-1",
pattern_1 = "wall_hole.1-1",
pattern_2 = "wall_hole.3-1",
pattern_3 = "wall_hole.2-1",
pattern_4 = "wall_hole.corner.2-1",
pattern_5 = "wall_hole.corner.1-1",
pattern_6 = "wall_hole.corner.3-1",
pattern_7 = "wall_hole.corner.4-1",
pattern_8 = "wall_hole.corner_reverse.2-1",
pattern_9 = "wall_hole.corner_reverse.1-1",
pattern_10 = "wall_hole.corner_reverse.3-1",
pattern_11 = "wall_hole.corner_reverse.4-1",
}
border_set{
id = "wall_low-1",
pattern_0 = "wall_low.4-1",
pattern_1 = "wall_low.1-1",
pattern_2 = "wall_low.3-1",
pattern_3 = "wall_low.2-1",
pattern_4 = "wall_low.corner.2-1",
pattern_5 = "wall_low.corner.1-1",
pattern_6 = "wall_low.corner.3-1",
pattern_7 = "wall_low.corner.4-1",
pattern_8 = "wall_low.corner_reverse.2-1b",
pattern_9 = "wall_low.corner_reverse.1-1b",
pattern_10 = "wall_low.corner_reverse.3-1b",
pattern_11 = "wall_low.corner_reverse.4-1b",
}
我已将它加载到一个名为 datString 的字符串中。我正在尝试匹配单个正则表达式中的所有 tile_pattern 部分。
这是我目前所拥有的:
//tilePatterns = new List<TilePatternData>();
//tile_pattern{
//id = "10", (string)
//ground = "empty", (string)
//default_layer = 2, (number)
//(x = 72,) (x = { 712, 728, 744 },) (number or table)(only matching the number, have to add in the table)
//(y = 0,) (y = { 384, 384, 384 },) (number or table)(only matching the number, have to add in the table)
//width = 8,
//height = 16,
//frame_delay(number, optional)(None in test file)
//mirror_loop (boolean, optional)(None in test file)
//scrolling (string, optional)(The Ones in the test file do not have a repeat_mode
//repeat_mode = "none", (string, optional)
//}
parts = new Regex("tile_pattern\\s*{\\s*(id\\s*=\\s*\".+\",\\s*ground\\s*=\\s*\".+\",\\s*default_layer\\s*=\\s*-*\\d+,\\s*x\\s*=\\s*\\d+,\\s*y\\s*=\\s*\\d+,\\s*width\\s*=\\s*\\d+,\\s*height\\s*=\\s*\\d+,\\s*\\w*\\s*=*\\s*\"*\\w*\"*),*\\s*}");
match = parts.Match(datFileString);
Debug.Log("Match " + match.Success + " : " + match.Length);
while (match.Success)
{
// To easily see which ones are getting loaded in
Debug.Log(match.Groups[1]);
//TilePatternData tilePatternData = new TilePatternData();
//tilePatternData.LoadFromDatFile(match.Groups[1].ToString());
//tilePatterns.Add(tilePatternData);
match = match.NextMatch();
}
通过我的调试日志一目了然地返回匹配长度 138(应该是 4830)唯一似乎缺少的是具有 x = { 712, 728, 744 } 的 32 种模式,我还没有想到了解如何将其添加到我的捕获组中,但我们将不胜感激。另外,我将如何添加 3 个可选字段以确保它们是否都匹配?
需要添加到图案中
tile_pattern{
id = "acid",
ground = "prickles",
default_layer = 0,
x = { 712, 728, 744 },
y = { 384, 384, 384 },
width = 16,
height = 16,
}
【问题讨论】:
-
为什么??? 只需在其中添加一些逗号,您就有了一个 json。 (它实际上是一点点。但说真的,它非常接近。)
-
我可以想象
\".+\"是这里的问题 -.+可能也在吃双引号。也许你可以试试\"[^\"]+\"。 -
我同意菲尔多。但即使您不能使用 JSON,我也强烈建议您不要对整个文件使用单个正则表达式。
-
您应该真正找出文件格式,然后使用真正的解析器。文件有扩展名吗?
-
这似乎是 Solarus 任务游戏中的 Tileset definition file。备注部分说: tileset 数据文件的这种语法实际上是有效的 Lua。引擎和编辑器在内部使用 Lua 对其进行解析。