2012-03-26 73 views
1

我具有由\t,分隔的字符串,但\t的數目不是固定的,例如:當使用Ruby分割字符串時,/ t + |,/和/ [ t +,] /有什麼區別?

a=["seg1\tseg2\t\tseg3,seg4"] 

seg2seg3由兩個\t分隔。

所以我試圖通過

a.split(/\t+|,/) 

分裂他們來說,打印正確的anwser:

["seg1", "seg2", "seg3", "seg4"] 

而且我也試試這個

a.split(/[\t+,]/) 

但得到的答覆是

["seg1", "seg2", "", "seg3", "seg4"] 

爲什麼紅寶石打印不同的結果?

回答

5

因爲\t+裏面的[]並不意味着「一個或多個標籤」,它的意思是「一個標籤或一個加號」。由於它找到兩個連續的製表符,它會分裂兩次,中間的字符串變爲空白。

大多數特殊字符,如. + * ?等,如果放置在一個區間內,則會變成「常規」字符。有一些例外情況,如^(取消開始時的間隔),\(即轉義下一個字符,就像它在區間外進行)和](即關閉間隔;另一個[是也不允許那裏)。所以,[\t+,]其實意味着'\t' or '+' or ','

不幸的是,我不知道需要或不需要在區間內轉義的全套字符的任何參考。有疑問,我傾向於逃避,以確保。在任何情況下,間隔將始終僅匹配單個字符,如果您想要不同的東西,則必須將量詞置於之外的區間。 (例如:[\t,]+,如果你也承認連續兩個逗號;否則,你的第一個正則表達式是真正正確的)

+1

全套需要在[]逃逸字符的是你提到的那些:[] \^plus - (取決於位置) – pguardiario 2012-03-26 07:28:39

+0

正確。有趣的是還要注意'''**不是**在區間之外的特殊字符,只在內部和其他兩個字符之間。除此之外,'^'也可以是特殊的或不依賴於位置(作爲第一個字符,否定間隔;其他地方都是常規字符)。最奇怪的是:']'作爲第一個字符被允許 - '[] x]'匹配「x」或「]」。這是因爲有那麼多的角落案例,我總是懷疑...... – mgibsonbr 2012-03-26 07:46:50

+0

實際上],因爲第一個字符會發出警告,但預計會在ruby正則表達式中轉義,儘管許多其他正則表達式引擎也允許這樣做。 – pguardiario 2012-03-26 11:09:14

相關問題