代码之家  ›  专栏  ›  技术社区  ›  Humphrey Bogart

用于分析基于文本的简单数据文件的regex

  •  1
  • Humphrey Bogart  · 技术社区  · 16 年前

    有人能帮我摸一下regex吗?

    我正在阅读一个简单的文本冒险的“地点”列表(那些在当时很流行的)。但是,我不确定如何获得输入。

    所有位置都遵循以下格式:

    <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
    

    (后续位置用空行分隔。)

    我将这些存储为具有以下结构的位置对象:

    public class Location {
    
        private String name;
    
        private Map<Direction, Location> links;
    
        private List<Item> items;
    
    }
    

    我使用一种方法从一个URL中检索数据,并从读取的文本中创建位置对象,但是我正处于这样一个完整的块中。我想瑞格丝会有帮助的。有人能借我一只急需的手吗?

    5 回复  |  直到 11 年前
        1
  •  3
  •   John Pirie    16 年前

    同意w/willcodejavaforfood,regex可以使用,但这不是一个很大的推动。

    听起来你只需要一点算法帮助(下面是草率的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
    
        2
  •  3
  •   Aaron Digulla    16 年前

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

    • 当你有不止一个花卉产品时会发生什么?它们都一样吗?一个冒险家不能在几个地方采一朵花来采一束吗?

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

    • 如果一个名字包含逗号怎么办?

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

    使用 JDom DecentXML 解析游戏配置。

        3
  •  2
  •   Peter Boughton    16 年前

    现在无法让我的脑袋进入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];
            }
    
        }
    
    
    }
    
        4
  •  0
  •   corlettk    16 年前

    你能改变数据的格式吗?这种格式很蹩脚。我怀疑你在忙着重新设计方轮…这个屏幕对我来说“只是使用XML”。

        5
  •  -1
  •   Jonas Kölker    16 年前

    我认为使用XML是过度杀戮(用大炮射击麻雀),而regexp是“欠杀戮”(使用一个太弱的工具,用牙刷刷洗地板)。

    正确的平衡听起来像是“.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库。正如另一张海报所指出的,你可能有名字冲突,所以我冒昧地添加了一个“名字:”字段。方括号中的名称将是唯一标识符。