2009-05-18 42 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 

(後續位置由一個空行分離。)

我存儲這些作爲位置具有以下結構的對象:

public class Location { 

    private String name; 

    private Map<Direction, Location> links; 

    private List<Item> items; 

} 

我使用一種方法從URL中檢索數據,並從讀取的文本中創建Location對象,但我在完成此塊的操作。我認爲正則表達式會有所幫助。任何人都可以借給我一隻需要的手嗎?

+1

提供從URL獲取數據的格式。這將是找到如何幫助你並解釋如何使用正則表達式提供的示例的最佳方式。 – 2009-05-18 13:06:38

回答

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

美麗!很好的簡單的僞代碼,謝謝。 – 2009-05-18 14:24:18

0

你能改變數據的格式嗎?這種格式是klunky。我懷疑你正在重新發明方形輪...這對我來說就是「只使用XML」。

+1

但我懷疑將數據重新格式化爲XML需要首先通過RegExp(或其他某種技術)對其進行解析。 – belugabob 2009-05-18 13:13:51

+1

這個想法不是首先使用文本,而是更結構化的東西。 – 2009-05-18 13:16:40

+0

問題是我沒有數據,它位於外部URL中,上面列出了基於文本的格式。通常我也會使用XML。 – 2009-05-18 14:21:25

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(數字)而不是文本,您可以使用多個具有相同名稱的單個項目/位置。

使用JDomDecentXML解析遊戲配置。

+3

假設他可以控制輸入格式。他的解讀聽起來像是他讀了一些外部URL,這不在他的控制之下。 – rudolfson 2009-05-18 13:19:03

+0

是的,我認爲他也寫服務器,因爲這種格式看起來不像你在網上很多地方可以找到的東西。 – 2009-05-18 13:48:44

+0

感謝您的廣泛答覆,但不幸的是,我無法控制服務器的數據,它只是按原樣提供給我的。通常我會訴諸使用XML格式的解決方案。 – 2009-05-18 14:23:00

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

蟒蛇,甜美。希望我可以在這裏使用它。 – 2009-05-18 14:45:54