2011-04-15 19 views
1

我的一個朋友說如果我使用的正則表達式太長,這可能是工作的錯誤工具。有沒有更好的方法來解析這些文字?我有一個正則表達式,可以將所有內容都返回給一個數組,我可以很容易地將它們分塊,但如果還有另一種更簡單的方法,我真的很想看到它。如何解析這個沒有正則表達式?

這裏是什麼樣子:

2 AB 123A 01JAN M ABCDEF AA1 100A 200A 02JAN T /ABCD /E  

這裏有一個突破下來:

  • 2是行號,這些範圍從1一路99。如果無法看到,因爲格式化的,有大於10

    的空間可以或可以不通過*

  • AB替換是數據的重要單元更小的空間性格特徵預謀號碼(UOD )。

    AB可能由/CD作爲前綴,這是另一個重要的UOD。

  • 123是一個重要的UOD。它的範圍可以從1(前面4個空格)到99999

  • A是一個重要的UOD。

  • 01JAN是日/月組合,我需要提取兩個UOD。

  • M是日期簡稱。這可能是17之間的數字。

  • ABC是一個重要的UOD。

  • DEF是重要的UOD。

    DEF後的空間可以是一個*

  • AA1可以是零個字符,或者它可以是5.是不重要的。

  • 100A是時間戳,但可能是格式爲1300。當時間爲1200P PM時,A可能爲N

  • 然後我們看到另一個時間戳。

  • 下一日期部分可以不存在,例如,這是有效的:

    93*DE/QQ51234 30APR J QWERTY*QQ0 1250 0520 /ABCD*ASDFAS /E    
    
  • 其中/ABCD*ASDFAS /E顯示的數據是無關的應用程序,但是,這是第二個日期戳可以在那裏出現。正斜線可能是別的東西(比如字母)。

注:
它不是空格分隔,身體的某些部位碰到別人。字符位置只針對列表中的前兩個或三個項目準確

我不認爲我遺漏了任何東西,但是,如果有更簡單的方法解析像這樣的字符串,而不是編寫正則表達式,請讓我知道。

+0

這是功課嗎? – Tejs 2011-04-15 19:58:56

+2

http://en.wikipedia.org/wiki/Finite-state_machine – 2011-04-15 19:59:01

+0

這不是家庭作業,這是一個遺留系統的屏幕刮擦。 http://www.scribd.com/doc/24980105/Mysabre-Manual(參見第35頁) – Incognito 2011-04-15 19:59:34

回答

6

這是正則表達式的完美任務。文本不包含嵌套,並且您正在匹配的項目相當簡單。

大多數正則表達式語法都有一個x傾斜標誌或模式,它允許空格和註釋提高可讀性。例如:

$regex = '@ 
    # 2 is the line number, these range from 1 all the way to 99. 
    # There is a space character prepending numbers less than 10. 
    # The space may or may not be replaced by an *. 
    [ *]\d|\d\d 
    \s 

    # AB is an important unit of data (UOD). 
    # AB may be prepended by /CD which is another important UOD. 
    (/CD)?AB 
    \s 

    # 123 is an important UOD. It can range from 1 (prepended by 4 spaces) 
    # to 99999. 
    \s{4}\d{1}|\s{3}\d{2}|\s{2}\d{3}|\s{1}\d{4}|\d{5} 
@x'; 

依此類推。

+1

哇,我不知道在正則表達式裏面發表評論,這真的很酷。謝謝! – Incognito 2011-04-15 20:12:05

0

只需編寫一個自定義分析器,逐行處理它。好像一切都是在一個固定的位置,而不是空間/逗號分隔的,所以簡單地用這些作爲指標,到你所需要的:

line_number = int(line_text[0:1]) 
ab_unit = line_text[3:4] 
... 

如果它確實是空間分隔的,只是split()每一行,然後解析通過每個塊,在適當的時候將每個塊分割成組成部分。

+0

它不是空間劃定的,身體的某些部位碰到別人。字符位置僅對列表中的前兩個或三個項目準確。另外,有些空間可能會變成*。 – Incognito 2011-04-15 20:02:02

1

你總是可以手動編寫你自己的解析器,但那會比正則表達式更多的代碼行。然而,對於讀者來說,代碼行可能會更簡單。

+0

你的意思是說,編寫一系列複雜的if語句和子字符串檢查比正則表達式更容易遵循嗎? – Incognito 2011-04-15 20:06:41

+0

如果正則表達式很複雜,是的。每個單獨的陳述都不會很複雜。 – 2011-04-17 16:43:49

2

對於這個應用程序來說,正則表達式看起來不錯,但爲了簡單性和可讀性,您可能希望將其分成幾個正則表達式(每個字段一個正則表達式),這樣人們可以更容易地跟隨正則表達式的哪一部分對應哪個變量。