[英]Regex for Parsing Simple Text-Based Datafile
谁能给我一点正则表达式的帮助?
我正在阅读一个“位置”列表,以进行简单的文字冒险(那些在当时很流行的冒险)。 但是,我不确定如何获取输入。
所有位置均遵循以下格式:
<location_name>, [<item>]
[direction, location_name]
如:
Albus Square, Flowers, Traffic Cone
NORTH, Franklandclaw Lecture Theatre
WEST, Library of Enchanted Books
SOUTH, Furnesspuff College
Library of Enchanted Books
EAST, Albus Square
UP, Reading Room
(后续位置由空白行分隔。)
我将这些存储为具有以下结构的Location对象:
public class Location {
private String name;
private Map<Direction, Location> links;
private List<Item> items;
}
我使用一种方法来从URL检索数据并从读取的文本创建Location对象,但是我在一个完整的步骤上这样做。 我认为正则表达式会有所帮助。 有人可以帮我一把吗?
您不想为此使用纯文本格式:
如果您拥有一个以上的花朵,会发生什么? 他们都一样吗? 冒险家不能在几个位置采摘鲜花来收集bouqet吗?
可能会有几个同名的房间(“地窖”,“街角”),即更衣室,增加了气氛但对游戏没有影响。 但是,他们没有自己的描述。 如何使它们分开?
如果名称包含逗号怎么办?
最终,您将要使用Unicode作为外来名称或格式说明。
由于这是结构化的数据,可能包含很多奇怪的情况,因此我建议对此使用XML:
<locations>
<location>
<name>Albus Square</name>
<summary>Short description for returning adventurer</summary>
<description>Long text here ... with formatting, etc.</description>
<items>
<item>Flowers</item>
<item>Traffic Cone</item>
<items>
<directions>
<north>Franklandclaw Lecture Theatre</north>
<west>Library of Enchanted Books</west>
<south>Furnesspuff College</south>
</directions>
</location>
<location>
<name>Library of Enchanted Books</name>
<directions>
<east>Albus Square</east>
<up>Reading Room</up>
</directions>
</location>
</locations>
这样可以提供更大的灵活性,解决了很多问题,例如格式化描述文本,Unicode字符等。此外,您可以使用多个ID(数字)代替文本来使用多个具有相同名称的项目/位置。
同意使用willcodejavaforfood,可以使用正则表达式,但在这里并不是很大的提升。
听起来您只需要一点算法帮助即可(紧随其后的p代码)...
currloc = null
while( line from file )
if line begins w/ whitespace
(dir, loc) = split( line, ", " )
add dir, loc to currloc
else
newlocdata = split( line, ", " )
currloc = newlocdata[0]
for i = 1 to size( newlocdata ) - 1
item = newlocdata[i]
add item to currloc
现在无法进入Java模式,因此下面的一些伪代码应该可以做到:
Data = MyString.split('\n\n++\s*+');
for ( i=0 ; i<Data.length ; i++ )
{
CurLocation = Data[i].split('\n\s*+');
LocationInfo = CurLocation[0].split(',\s*+');
LocationName = LocationInfo[0];
for ( n=1 ; n<LocationInfo.length ; n++ )
{
Items[n-1] = LocationInfo[n];
}
for ( n=1 ; n<CurLocation.length ; n++ )
{
DirectionInfo = LocationInfo[n].split(',\s*+');
DirectionName = DirectionInfo[0];
for ( x=1 ; x<DirectionInfo.length ; x++ )
{
DirectionLocation[x-1] = DirectionInfo[x];
}
}
}
您可以更改数据格式吗? 这种格式很笨拙。 我怀疑您正在忙于重新设计方形齿轮...这对我来说是“只使用XML”。
我认为使用XML是过分的(用大炮射击麻雀),而正则表达式则是“过少的”(使用太弱的工具,用牙刷擦洗地板)。
正确的平衡听起来像是“ .ini格式”或“带有部分的邮件头”。 对于python,位于http://docs.python.org/library/configparser.html的库文档。
一个简单的例子:
[albus_square]
name: Albus Square
items: Flowers, Traffic Cone
north: lecture_theatre
west: library_enchanted_books
south: furnesspuff_college
我假设有一个Java库用于这种格式。 正如另一位海报指出的那样,您可能会遇到名称冲突,因此我随意添加了“名称:”字段。 方括号中的名称将是唯一标识符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.