【问题标题】:Regex for Parsing Simple Text-Based Datafile用于解析简单的基于文本的数据文件的正则表达式
【发布时间】:2009-05-18 13:04:43
【问题描述】:

任何人都可以帮助我了解一下正则表达式吗?

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

位置都遵循以下格式:

<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 检索数据并从读取的文本中创建 Location 对象,但我完全无法做到这一点。我认为正则表达式会有所帮助。谁能帮我一把?

【问题讨论】:

  • 提供从 URL 获取数据的格式。这将是找到如何帮助您并解释如何在提供的示例中使用正则表达式的最佳方式。

标签: java regex parsing adventure


【解决方案1】:

同意 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

【讨论】:

    【解决方案2】:

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

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

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

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

    • 最终,您会希望将 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 解析游戏配置。

    【讨论】:

    • 假设他可以控制输入格式。他的描述听起来像是他阅读了一些不受他控制的外部 URL。
    • 是的,我假设他也编写了服务器,因为这种格式看起来不像您可以在网络上的许多地方找到的东西。
    • 感谢您的广泛回答,但不幸的是我无法控制服务器的数据,它只是按原样提供给我的。通常我也会求助于使用 XML 格式的解决方案。
    【解决方案3】:

    我现在无法进入 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】:

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

      【讨论】:

      • 但我怀疑将数据重新格式化为 XML 将首先需要使用 RegExp(或其他一些技术)对其进行解析。
      • 这个想法不是首先使用文本,而是使用更有条理的东西。
      • 问题是我没有数据,它位于外部 URL,采用上述基于文本的格式。通常我也会使用 XML。
      【解决方案5】:

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

      【讨论】:

      • Python,亲爱的。希望我能在这里使用它。
      猜你喜欢
      • 2010-12-13
      • 2011-06-19
      • 1970-01-01
      • 2010-10-29
      • 2010-09-08
      • 2020-11-13
      • 1970-01-01
      • 2016-09-23
      • 2011-12-03
      相关资源
      最近更新 更多