2010-09-11 65 views
1

我有兩個字符串,我需要拉出數據,但似乎無法得到它的工作。我希望我知道正則表達式,但不幸的是我不知道。我已經閱讀了一些初學者教程,但似乎無法找到能夠滿足需要的表達式。如何使用正則表達式來解決此問題?

在這個由等號分隔的第一個字符串中,我需要跳過前6個字符並獲取以下9個字符。在平等的角色之後,我需要抓住前四個角色,這是一年一年。最後對於這個字符串,我需要剩餘的數字,這是YYYYmmdd中的一個日期。

636014034657089=130719889904 

第二個字符串似乎有點困難,因爲字符之間的空格不同,但似乎總是被至少一個空格分隔。有時候,有多達15或20個空格分隔數據塊。

以下是顯示空間差異的兩個不同樣本。

!!92519 C 01 M600200BLNBRN D55420090205M1O 

!!95815  A    M511195BRNBRN   D62520070906 ":%/]Q2#0*& 

,我需要這些最後兩個字符串的數據是:

The zip code following the 2 exclamation marks. 
The single letter 'M' following that. It always appears to be in a 13 character block 
The 3 numbers after the single letter 
The next 3 numbers which are the person's height 
The following next 3 are the person's weight 
The next 3 are eye color 
The next block of 3 which are the person's hair color 

最後一塊,我是從需要的數據:

我需要得到一個字母這在示例似乎是'D'。 跳過接下來的3號 最後和剩餘的8個數字是如果有人可以幫我解決這年月日

的日期,我會非常感激。

+1

您正在使用哪種編程語言?並非所有的語言對於正則表達式都有相同的語法。 – newbie 2010-09-11 20:43:39

+1

question is tagged PHP – nico 2010-09-11 21:44:30

回答

2

對於您可以使用此正則表達式的第一個字符串:

^[0-9]{6}([0-9]{9})=([0-9]{4})([0-9]{4})([0-9]{2})([0-9]{2})$ 

說明:

 
^   Start of string/line 
[0-9]{6} Match the first 6 digits 
([0-9]{9}) Capture the next 9 digits 
=   Match an equals sign 
([0-9]{4}) Capture the "day and year" (what format is this in?) 
([0-9]{4}) Capture the year 
([0-9]{2}) Capture the month 
([0-9]{2}) Capture the date 
$   End of string/line 

對於第二個:

^!!([0-9]{5}) +.*? +M([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2}) 

Rubular

它工作與第一種方法類似。如果您的數據不完全採用正則表達式所需的格式,則可能需要稍微調整它。您可能想用更精確的東西替換.*?,但我不確定是什麼原因,因爲您沒有描述您不感興趣的部分的格式。

+0

Thanks Mark。我現在要試一試。 – Jim 2010-09-11 20:43:41

+1

@Jim - 使用捕獲組。 – TrueWill 2010-09-11 20:51:53

+0

馬克,第二個正則表達式根本不匹配任何東西。我收到一個編譯錯誤。 '編譯失敗:沒有重複在偏移45' – Jim 2010-09-11 21:02:40