2014-04-03 19 views
1

我想解析下面的字符串,但我似乎無法弄清楚如何使用正則表達式否定詞。我有以下短信歷史記錄。正面循環解析與負面的單詞預測

string = '2014-03-29 10:29:24 AM: John Doe: Hey dude how are you feeling 2014-03-29 10:30:39 AM: Billy: Hey Doe, Im feeling better now. 2014-03-29 10:30:58 AM: Billy: Yup' 

我正則表達式的紅寶石查詢目前看起來是這樣的:

string.scan(/((\d{4}-\d{2}-\d{2}\s+\d{2}\:\d{2}\:\d{2}\s+[AP][M])\:\s(.*?)\:\s([^\d{4}]*))/) {|match| puts match} 

Output: 
    2014-03-29 10:29:24 AM: John Doe: Hey dude how are you feeling 
    2014-03-29 10:29:24 AM 
    John Doe 
    Hey dude how are you feeling 
    2014-03-29 10:30:39 AM: Billy: Hey Doe, Im feeling better now. 
    2014-03-29 10:30:39 AM 
    Hason 
    Hey Doe, Im feeling better now. 
    2014-03-29 10:30:58 AM: Billy: Yup 
    2014-03-29 10:30:58 AM 
    Billy 
    Yup 

問題

我正則表達式否定僅供字符,而不是單詞。 [^ \ d {4}]只在檢測到任何數字而不是像'2014'這樣的詞時停止。

回答

1

嘗試下面的一個。我已經使用?:,以避免從你的正則表達式捕獲組的少數。此外,增加了一個積極的前瞻(?=\d{4}-|$)看看是否有任何\d\d\d\d-格式可用在下一個或其行尾。如果你想要的話,你可以把它改成你的模式(我的意思是把它變成yyyy-mm-dd格式)。

string.scan(/((?:\d{4}-\d{2}-\d{2}\s+\d{2}\:\d{2}\:\d{2}\s+[AP][M])\:\s(?:.*?)\:.*?)(?=\d{4}-|$)/) {|match| puts match} 

輸出:

2014-03-29 10:29:24 AM: John Doe: Hey dude how are you feeling 
2014-03-29 10:30:39 AM: Billy: Hey Doe, Im feeling better now. 
2014-03-29 10:30:58 AM: Billy: Yup 
0

可以匹配所有到一個特定的 「字」 像這樣,例如字 「2014」:

(?>[^2]+|2(?!014))* 

與不明同期(四位數字):

(?>[^0-9]+|[0-9](?![0-9]{3}-))* 

的另一種方式是將字符串先行拆分:

string.split(/(?=\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+[AP][M]:)/) 

注:這三種模式,你可以選擇你想怎麼具體,長度和先行斷言內的子模式的精度。

0

字符類不會像這樣工作。

[^\d{4}]*

含義:

^ - Negative class, so - 
\d - Not digit 0-9 
{ - Not '{' 
4 - Not '4' 
} - Not '}' 

而且,類可選匹配這個設置很多次。
因此,停止,將不匹配的一些Not digit 0-9

比賽,直到4位數字也可以是這樣的

(       # (1 start) 
     (       # (2 start) 
      \d{4} - \d{2} - \d{2} 
      \s+ 
      \d{2} \: \d{2} \: \d{2} 
      \s+ 
      [AP] [M] 
    )        # (2 end) 
     \: \s 
     (.*?)      # (3) 
     \: \s 
     (       # (4 start) 
      (?: 
       (?! \d{4})    # Not 4 digits ahead of this character 
       .      # Ok, match the character 
      )* 
    )        # (4 end) 
)        # (1 end)