2013-08-26 73 views
2
設置

如何我在字符串分隔不同的字符集?舉例來說,如果我有這些字符集:分區/拆分通過字符的字符串在Ruby中

[a-z] 
[A-Z] 
[0-9] 
[\s] 
{everything else} 

而這種輸入:

thisISaTEST***1234pie 

然後我想分開不同的字符集,例如,如果我用一個換行符作爲分隔符:

this 
IS 
a 
TEST 
*** 
1234 
pie 

我已經試過此正則表達式,以積極前瞻:

'thisISaTEST***1234pie'.gsub(/(?=[a-z]+|[A-Z]+|[0-9]+|[\s]+)/, "\n") 

但顯然+ s的不貪婪,因爲我越來越:

t 
h 
# (snip)... 
S 
T*** 
1 
# (snip)... 
e 

我剪斷了不相關的部分,但你可以看到每個字符計數作爲自己的字符集,除了{everything else}字符集。

我該怎麼做?它不一定是由正則表達式。將它們拆分成一個數組也可以。

+0

(抱歉的可怕稱號;我想不出任何更好的東西。如果你明白我想要什麼,請做編輯,你可以考慮更好的。 ':)') – Doorknob

回答

4

困難的部分是等額返還,不與正則表達式的其餘部分相匹配。忘記這一點,並考慮一種方法,您可以將不匹配的部分與匹配的部分混合在一起。

"thisISaTEST***1234pie" 
.split(/([a-z]+|[A-Z]+|\d+|\s+)/).reject(&:empty?) 
# => ["this", "IS", "a", "TEST", "***", "1234", "pie"] 
1

ASCII字符集,除了字母數字和空間,有32「標點符號」的字符,其與屬性構建\p{punct}匹配。

要分割的字符串爲一類的順序,你可以寫

str = 'thisISaTEST***1234pie' 
p str.scan(/\G(?:[a-z]+|[A-Z]+|\d+|\s+|[\p{punct}]+)/) 

輸出

["this", "IS", "a", "TEST", "***", "1234", "pie"] 

另外,如果你的字符串包含ASCII字符集以外的字符,你可以寫在性能方面,整個事情,這樣

p str.scan(/\G(?:\p{lower}+|\p{upper}+|\p{digit}+|\p{space}|[^\p{alnum}\p{space}]+)/) 
+0

我不想只是標點符號,我希望任何其他角色都能正常工作。 – Doorknob

+0

我試圖解釋這一切仍然字母數字和空格後面是標點字符(和控制字符)。如果您的數據包含ASCII集以外的字符,那當然不起作用。 – Borodin

-1

非字,非空格字符可以用[^\w\s]覆蓋,所以:

"thisISaTEST***1234pie".scan /[a-z]+|[A-Z]+|\d+|\s+|[^\w\s]+/ 
#=> ["this", "IS", "a", "TEST", "***", "1234", "pie"] 
+0

錯過'「_」'。 – sawa

+0

@sawa - '_'是一個字字符,但它不適合任何這些羣體,因此它屬於的地方,目前還不清楚。 – pguardiario

+0

它顯然屬於OP的'其他'',但它不適合你的正則表達式的任何地方。 – sawa