2010-04-19 104 views
6

我一直在嘗試構造一個匹配尾隨空格的ruby正則表達式,但不是縮進佔位符 - 所以我可以將它們排除在外。正則表達式匹配尾隨空格,但不是完全是空格的行(縮進佔位符)

我有這/\b[\t ]+$/它正在工作,直到我意識到它只適用於行結束時[a-zA-Z]。 :-(所以我演變成了這個/(?!^[\t ]+)[\t ]+$/,它似乎越來越好,但它仍然不能正常工作。我花了數小時試圖讓這個工作無濟於事。一些文本測試,所以很容易投入Rubular,但縮進線被剝離,所以它需要一些空格和/或製表符。一旦行3 & 4有空間回來,它不應該匹配3- 5,7,9

some test test 
some test test  


    some other test (text) 
    some other test (text) 
    likely here{ dfdf } 
    likely here{ dfdf }   
    and this ; 
    and this ; 

另外,有一個簡單的/更優雅的方式來做到這一點?

+0

感謝聯機代碼標記Gumbo。下次我會拿到它們。:-) – tjmcewan 2010-04-20 00:32:38

回答

11

如果你使用1.9,你可以使用向後看:

/(?<=\S)[\t ]+$/ 

但不幸的是,它不是在舊版本的紅寶石的支持,所以你必須處理捕獲的字符:

str.gsub(/(\S)[\t ]+$/) { $1 } 
+0

是的,而不是1.9對於大多數項目。第二個是票 - 非常感謝! – tjmcewan 2010-04-20 00:36:00

+0

如果您有非空格和非空格空格,人們正在討論將[\ t]更改爲「更通用」的版本[\ s]。他們在談論什麼「空白」? – parallelgeek 2012-04-21 22:59:44

+0

@parallelgeek'\ s'也會匹配'「\ n」','「\ r」'和'「\ f」'。 – mckeed 2012-05-09 17:17:46

0

這是不是幫助嗎?

/([^\t ])([\t ]+)$/ 

儘管如此,您還是需要對匹配的最後一個非空格字符進行操作。

0

編輯:哦,你的意思是非空行。然後你需要像/([^ \ s])\ s + /,並將它們與第一部分

我不完全確定你在問什麼,只想捕捉尾隨的空格?

([\s]+)$ 

,或者如果你只是想捕捉標籤

([ \t]+)$ 

由於正則表達式是貪婪的,他們會抓住儘可能多的,因爲他們可以。如果你知道你想要捕捉什麼,你並不需要事先給他們上下文。

我仍然不確定尾隨縮進佔位符是什麼意思,所以如果我誤解了,我很抱歉。

+0

對不起,'indentation佔位符'我的意思是你的代碼編輯器自動縮進,以保持你的塊對齊。這些行完全由空白組成,因此被TextMate附帶的標準剝離正則表達式剝奪:'[\ t] + $' – tjmcewan 2010-04-20 01:47:12

1

您的第一個表達式很接近,您只需將\ b更改爲否定字符類。這應該更好的工作:

/([^\t ])[\t ]+$ 

在普通的話,這對遵循一個字符不是一個選項卡或空格線所有選項卡和空格相匹配。

+0

不幸的是,這看起來與縮進佔位符匹配 - 這是完全由空白組成的行。 – tjmcewan 2010-04-20 00:37:51

+0

它不適合我,所以我不確定它爲什麼會爲你做。該行必須有一個不是空格或製表符的字符才能匹配。如果您的空格不是空格或製表符,稍微更通用的版本將是/([^ \ s])\ s + $ /。 – 2010-04-20 13:36:15

+0

從上面看,mckeed的第二個答案與我的非常相似,雖然它更簡潔,並且具有被ruby化的額外好處,所以我建議你接受他作爲答案; o) – 2010-04-20 13:44:16

0

或許這...

[\ t | \ S] + $

或 [] + $

相關問題