Regex для анализа простого текстового файла данных - PullRequest
1 голос
/ 18 мая 2009

Кто-нибудь может дать мне руку с оттенком регулярного выражения?

Я читаю список «мест» для простого текстового приключения (столь популярного в те времена). Тем не менее, я не уверен, как получить входные данные.

Все местоположения следуют формату:

<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 из прочитанного текста, но я нахожусь в полной готовности сделать это. Я думаю, что регулярное выражение будет полезным. Кто-нибудь может дать мне столь необходимую руку?

Ответы [ 5 ]

3 голосов
/ 18 мая 2009

Вы не хотите использовать текстовый формат для этого:

  • Что происходит, когда у вас есть более одного цветочного предмета? Они все одинаковые? Не может ли искатель приключений собрать букет, собирая отдельные цветы в нескольких местах?

  • Вероятно, будет несколько комнат с одним и тем же названием ("погреб", "угол улицы"), то есть комнаты для прихожей, которые добавляют атмосферу, но ничего не делают в игре. Однако они не получают собственного описания. Как их разлучить?

  • Что если имя содержит запятую?

  • В конце концов, вы захотите использовать Юникод для иностранных имен или инструкций по форматированию.

Поскольку это структурированные данные, которые могут содержать множество странных случаев, я предлагаю использовать 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>

Это обеспечивает большую гибкость, решает множество проблем, таких как форматирование текста описания, символов Юникода и т. Д., Плюс вы можете использовать более одного элемента / местоположения с тем же именем, используя идентификаторы (цифры) вместо текста.

Используйте JDom или DecentXML для анализа конфигурации игры.

3 голосов
/ 18 мая 2009

Согласитесь, с / 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 голосов
/ 18 мая 2009

Сейчас я не могу войти в режим 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];
        }

    }


}
0 голосов
/ 18 мая 2009

Я думаю, что использование 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. Как указал другой автор, вы можете столкнуться с именами, поэтому я позволил себе добавить поле «name:». Имя в квадратных скобках будет уникальным идентификатором.

0 голосов
/ 18 мая 2009

Можете ли вы изменить формат данных. Этот формат клунки. Я подозреваю, что вы заняты изобретением квадратного колеса ... Это кричит "Просто используйте XML" для меня.

...