2009-05-18 5 views
1

Может ли кто-нибудь дать мне руку с приложением регулярного выражения?Regex for Parsing Простой текстовый файл данных

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

Местах все следуют формат:

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

+1

Укажите формат, в котором вы получаете данные из URL. Это был бы лучший способ найти, как помочь вам, и объяснить, как использовать regexp в приведенном примере. –

ответ

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 
+0

Красивая! Хороший простой псевдокод, спасибо. –

0

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

+1

Но я подозреваю, что повторное форматирование данных в формате XML потребует, чтобы он был проанализирован с помощью RegExp (или какой-либо другой техники). – belugabob

+1

Идея состоит не в том, чтобы использовать текст в первую очередь, а в том, что более структурировано. –

+0

Проблема в том, что у меня нет данных, это внешний URL, в текстовом формате, описанном выше. Обычно я бы использовал XML. –

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 и т. д. Кроме того, вы можете использовать более одного элемента/места с тем же именем, используя идентификаторы (цифры) вместо текста.

Используйте JDom или DecentXML, чтобы проанализировать конфигурацию игры.

+3

Предполагается, что он контролирует формат ввода. Его decription звучит так, как будто он читает какой-то внешний URL-адрес, который не находится под его контролем. – rudolfson

+0

Да, я предполагаю, что он также пишет сервер, так как этот формат не похож на то, что вы можете найти во многих местах в сети. –

+0

Спасибо за обширный ответ, но, к сожалению, у меня нет контроля над данными сервера, это просто предоставляется мне как есть. Обычно я прибегаю к использованию решения формата XML. –

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]; 
     } 

    } 


} 
-1

Я думаю, с помощью XML является излишеством (стрельба по воробьям с пушками) в то время как регулярные выражения являются «underkill» (используя слишком слабый инструмент, чистящие полы с зубной щеткой).

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

+0

Python, сладкий. Хотел бы я использовать его здесь. –