2016-01-02 217 views
1

假設我有這些字符串(每行是一個單獨的字符串):複合字符串匹配

5207 
002 
LEC 
WF 9:30AM - 10:20AM 
RCH 302 
Firas Mansour 
01/04/2016 - 04/04/2016 

我試圖創建一個正則表達式,將匹配WF 9:30AM - 10:20AM線。我遇到問題,從正則表達式中分離出其他字符串究竟是什麼。該行的格式可以變化一點點:

  • 調用WF部分A部分A部分可以由 'M', 'T', 'W', '日', 'F' 的,或任何級聯組合。在這個例子中,部分A是W和F.

  • B部分是第一次。這可以在例如12h中,或者像這樣的24小​​時:M 19:00 - 20:50

  • 之後是連字符,第二次與第一次相同的格式。

我不太確定如何解決這個問題,任何幫助都會很棒!如果一個正則表達式只匹配那條線而沒有其他匹配,那麼它就可以工作。

回答

3

看起來你應該只是把各部分陸續:

^([MTWF]|Th)+ \d\d:\d\d([AP]M)? - \d\d:\d\d([AP]M)?$ 

|----------| |---------------| |---------------| 
^       ^ ^
|       |  part 3: same as part 2 
part 1: match one of these: | 
- "M", "T", "W", or "F"  | 
- "Th"      | 
          part 2: match two digits, followed by a colon, 
            followed by another two digits, then 
            possible either "A" or "P" followed by 
            "M" 

的「^」開頭和「$」,在結尾處,以確保線路沒有任何其他文本。

如果你只關心匹配的有效時間(而不是任何兩個數字小時),你可以做一些票友,像這樣:

((1?\d|2[0-3]):[0-5]\d|(1[0-2]|\d):[0-5]\d[AP]M) 
+0

這不符合OP的例子 - 我想你應該用\ d {1,2}替換\ d \ d:\ d \ d([AP] M)?':\ d \ d( [AP] M)?' –

+0

@ SebastianProske好點 - 固定 – KSFT

+0

我會建議把整個東西包裝在'^ ... $'中,並用更多的原諒'\ s +'或'\ s * '(後者圍繞破折號) –

3

如何鏈接的部分之一後對方:

(?:[MTWF]|(?:Th))*\s\d+:\d\d(?:[AP]M)*\s-\s\d+:\d\d(?:[AP]M)* 

Regular expression visualization

看到一個demo

+1

這與我的回答有什麼不同? – KSFT

+0

@KSFT似乎是一樣的,而且你快一點。 –

+0

ty爲鏈接,這個網站看起來非常有幫助。 +1 – Nathan