繁体   English   中英

用于解析基于文本的简单数据文件的正则表达式

[英]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(数字)代替文本来使用多个具有相同名称的项目/位置。

使用JDomDecentXML解析游戏配置。

同意使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM