2009-05-18 7 views
1

誰でも私に手がかりを与えることができますか?シンプルなテキストベースのデータファイルを解析するための正規表現

私はシンプルなテキストの冒険のために "場所"のリストを読んでいます(その日の人気が高いもの)。しかし、私は入力を取得する方法については不明です。

<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 

(後続の位置が空白行で分離されている。)

I場所としてこれらを記憶してい構造を持つオブジェクト:

public class Location { 

    private String name; 

    private Map<Direction, Location> links; 

    private List<Item> items; 

} 

URLからデータを取得し、読み込んだテキストからLocationオブジェクトを作成するメソッドを使用しますが、これを行うには完全なブロックです。私は正規表現が助けになると思う。誰かが私に必要な手を貸してくれますか?

+1

URLからデータを取得する形式を指定します。これは、あなたの手助けをし、regexpの使い方を説明する最良の方法です。 –

答えて

3

正規表現を使用することはできますが、ここではあまり効果がありません。

ちょっとしたアルゴリズムの助けが必要なような音がします。

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文字などがあります。また、テキストの代わりにID(数字)を使用することにより、同じ名前の複数の項目/場所を使用することができます。

JDomまたはDecentXMLを使用して、ゲームの設定を解析します。

+3

これは彼が入力フォーマットを制御できると仮定しています。彼の処刑は、彼がコントロールしていないいくつかの外部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を使用して(大砲とスズメ撮影)やり過ぎだと思います正規表現は「アンダーキル」(あまりにも弱いツールを使用し、歯ブラシで床をこすります)です。

右のバランスは、「.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、sweet。私はここでそれを使うことができれば幸いです。 –

関連する問題