2011-03-05 59 views
0

給定的文本,如:正則表達式 - 匹配Rubular府不是在Ruby的

body = 

yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada 
< via mobile device > 

Yada Yada <[email protected]> wrote: 

yada yada yada yada yada yada yada yada yada 

我想匹配的第二個段落,所以我做:

body = body.split(/.* <[email protected]> wrote: .*/m).first 

但是,這不是在紅寶石匹配即使它在Rubular中。任何想法爲什麼?感謝

回答

1

嘗試此代替:

body = body.split(/.*<[email protected]> wrote:.*/).first 

後的第一.*是無用的,並且前.*(如@aef指出)的空間是錯誤的(也許有在一個空間存在空間你的紅寶石測試)。

請注意,我也刪除了m修飾符。如果我沒有,正則表達式會匹配整個字符串,導致一個空的數組。這就是Ruby調用模式(和其他人呼籲單行點所有模式):.匹配任何包括換行。

編輯:See it on ideone.com

+0

感謝...使用分裂,而不是掃描? ÿ? – AnApprentice 2011-03-05 05:38:45

+0

仍然不匹配... – AnApprentice 2011-03-05 05:41:16

+0

它適用於我;看我的編輯。但是,'scan'也是一個選項:'body = body.scan(/.+/)。first'。切斷'<通過移動設備>'行;如果你想保留它,你可以改變正則表達式爲'/.+(?:\ n。+)* /'。這匹配一切,直到下一個空行。還有很多其他方法可以解決這個問題。 – 2011-03-05 06:25:15

1

Yada Yada <[email protected]> wrote: 

確實與斷行結束了,沒有用的空間。所以你的正則表達式應該是:

/.* <[email protected]> wrote:\n.*/m 

注意:Windows系統和HTML等一些協議可以使用不同的換行符編碼。如果您想確保兼容,請先將輸入內容轉換爲unix linebreak編碼,然後再進行數據提取。你可以用我的linebreak gem這個。