1

任何人都可以给我一点正则表达式的帮助吗?

我正在阅读一个简单文本冒险的“位置”列表(那些在当时很受欢迎)。但是,我不确定如何获取输入。

这些位置都遵循以下格式:

<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 对象,但我完全无法做到这一点。我认为正则表达式会有所帮助。任何人都可以借我一个急需的手吗?

4

5 回答 5

3

您不想为此使用纯文本格式:

  • 当您拥有多个花卉时会发生什么?它们都一样吗?冒险者不能通过在多个地点采摘一朵花来收集花束吗?

  • 可能会有几个同名的房间(“地窖”、“街角”),即填充房间,它们增加了气氛,但对游戏没有任何意义。不过,他们没有得到自己的描述。如何让他们分开?

  • 如果名称包含逗号怎么办?

  • 最终,您会希望将 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(数字)而不是文本来使用多个具有相同名称的项目/位置。

使用JDomDecentXML解析游戏配置。

于 2009-05-18T13:15:43.103 回答
3

同意 w/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
于 2009-05-18T13:20:20.787 回答
2

我现在无法进入 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];
        }

    }


}
于 2009-05-18T13:22:10.440 回答
0

你能改变数据的格式吗?这种格式很笨拙。我怀疑您正忙于重新发明方轮……这对我来说是“只使用 XML”。

于 2009-05-18T13:11:39.587 回答
-1

我认为使用 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 库。正如另一位海报所指出的,您可能会遇到名称冲突,所以我冒昧地添加了一个“名称:”字段。方括号中的名称将是唯一标识符。

于 2009-05-18T13:42:35.390 回答