如何將字串:轉換'Hello world!'為陣列:['Hello', ' ', 'world!']保留所有空格?
我嘗試使用split具有不同引數的方法轉換字串,但沒有找到正確的解決方案。
此外,我在檔案( Class: String (Ruby 3.1.0) )中沒有找到適合解決此問題的任何其他方法。
uj5u.com熱心網友回復:
我突然想到,你可以使用scan. 假設您的字串存盤在變數s中,并且您想要分隔空間區域和非空間區域,您可以執行
s.scan(/[ ] |[^ ] /)
在你的情況下會產生
["Hello", " ", "world!"]
uj5u.com熱心網友回復:
使用 String#scan 而不是 String#split
您不想使用String#split因為那不會保留您的空間。您想改用String#scan或String#partition。使用Unicode 字符屬性,您可以通過以下方式掃描匹配項:
'Hello world!'.scan /[\p{Alnum}\p{Punct}] |\p{Space} /
#=> ["Hello", " ", "world!"]
如果您愿意,也可以使用 POSIX 字符類(在 Ruby 中發音為“括號運算式”)來做同樣的事情。例如:
'Hello world!'.scan /[[:alnum:][:punct:]] |[[:space:]] /
#=> ["Hello", " ", "world!"]
這些選項中的任何一個都將比依賴純 ASCII 字符或文字空白原子的解決方案更強大,但如果您知道您的字串不會包含其他型別的字符或編碼,那么這些解決方案也可以作業。
為簡潔起見,謹慎使用元字符
如果您正在尋找正則運算式的簡潔性,并且您確定您不需要關心 Unicode 字符或明確區分非空白字符和標點符號,您還可以使用\s和\S 元字符。例如:
'Hello world!'.scan /\s |\S /
#=> ["Hello", " ", "world!"]
這通常不如上面的字符屬性或括號運算式那么健壯,但仍然明確、簡短且易于閱讀。它適合你的例子,所以值得一提,但是\S元字符可以匹配控制字符和其他意想不到的東西,所以除非你真的知道你的資料,否則你需要謹慎使用它。例如,您的字串可能包含不可見的 NUL 或控制字符(如 CTRL-D),在這種情況下\S會捕獲它并回傳 Unicode 轉義字符:
"\x00".scan /\S /
#=> ["\u0000"]
?\C-D.scan /\S /
#=> ["\u0004"]
這可能不是您所期望的,但考慮到更大的資料集,這種事情不可避免地會發生。您越明確,您的生產資料可能遇到的問題就越少。
使用字串#partition
對于原始示例中非常簡單的用例,您只有兩個由空格分隔的單詞。這意味著您還可以使用String#partition對順序空白進行磁區。這會將字串分成三個元素,保留分隔單詞的空格。例如:
'Hello world!'.partition /\s /
#=> ["Hello", " ", "world!"]
雖然更簡單,但磁區方法不適用于較長的字串,例如:
'Goodbye cruel world!'.partition /\s /
#=> ["Goodbye", " ", "cruel world!"]
因此對于一般用例,String#scan 將是一種更好、更靈活的方法。但是,無論何時您想將一個字串拆分為三個元素,或保留磁區元素本身,#partition 都會非常方便。
uj5u.com熱心網友回復:
您可以繼續使用并通過使用簡單的 asplit來保留空格:regexcapture group
"Hello World ! ".split(/( )/)
#=> ["Hello", " ", "World", " ", "!", " "]
我知道的唯一問題是以空格開頭的字串將導致一個以空字串開頭的陣列:
" Hello World ! ".split(/( )/)
#=> ["", " ", "Hello", " ", "World", " ", "!", " "]
如果這是一個問題,您可以添加類似drop_while的東西:
" Hello World ! ".split(/( )/).drop_while(&:empty?)
#=> [" ", "Hello", " ", "World", " ", "!", " "]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426756.html
上一篇:正則運算式重復模式
