2017-03-18 55 views
0

使用Ruby 2.4。我想拆就破但還是不換空間,我的字符串,下面的表達式如何從我的結果中獲得分割標記?

str = "aa 11:22 bb 33.44:55 cc dd 123" 
#=> "aa 11:22 bb 33.44:55 cc dd 123" 
str.split(/(\t|[[:space:]])+/) 
#=> ["aa", " ", "11:22", " ", "bb", " ", "33.44:55", " ", "cc", " ", "dd", " ", "123"] 

在結果中包括空格。我該如何做分割,以便空格不包含在結果中?

+0

'str.scan(/ \ S + /)'適用於您的示例。 –

+1

如果後者與前者匹配,爲什麼使用'\ t'和'[:space:]'?只需使用'str.split(/ [[:space:]] + /)' –

+0

Hey Wiktor,如果字符串是「aaa」,那麼使用表達式會產生[「」,「aaa」]。注意開始處的空白元素 - 我想避免這種情況。 – Dave

回答

1

您陣列中獲得" "是因爲(\t|[[:space:]])是一個捕獲組。使用非捕獲組:

str.split(/(?:\t|[[:space:]])+/) 
    #=> ["aa", "11:22", "bb", "33.44:55", "cc", "dd", "123"] 

請參閱String#split

如果您想拆分拆分或不拆分空格,並且不希望在結果數組的開頭或結尾有相同的字符串,則可以執行以下操作。

str = " \u00A0aa\t11:22\u00A0bb 33.44:55 cc dd 123 " 

str.gsub(/\A[[:space:]]+|[[:space:]]+\z/,'').split(/[[:space:]]+/) 
    #=> ["aa", "11:22", "bb", "33.44:55", "cc", "dd", "123"] 
+0

Hi Cary,如果str =「\ u00A0aa \ t11:22 \ u00A0bb 33.44:55 cc dd 123」,然後應用你所擁有的,結果是[「aa」,「11:22」,「bb」,「 「,」「,」「,」33.44:55「,」cc「,」dd「,」123「](注意所有的空白元素)。任何方式來消除這些? – Dave

+0

@Dave,我無法重現你的結果。我發現在第二個'[[:space:]]'(放回去)之後,我的某個地方失去了'+',但這並不代表你報告的結果。請重新檢查。 –

2
str.split(/[[:space:]]/) 
#=> ["aa", "11:22", "bb", "33.44:55", "cc", "dd", "123"] 

對於您的測試數據只是split將工作:使用不同的輸入字符串使用

str.split 
#=> ["aa", "11:22", "bb", "33.44:55", "cc", "dd", "123"] 

幾個選項:

str = "aa\t11:22\tbb 33.44:55 cc dd 123" 
str.split(/\t|[[:space:]]/) 
#=> ["aa", "11:22", "bb", "33.44:55", "cc", "dd", "123"] 
str.split(/\s+/) # one more way 
#=> ["aa", "11:22", "bb", "33.44:55", "cc", "dd", "123"] 
+0

謝謝。但是如果字符串是「aa \ t11:22 \ tbb 33.44:55 cc dd 123」(注意單詞之間有多個空格),那麼使用分割的結果是[「aa」,「11:22」,「bb」,「 「,」33.44:55「,」cc「,」dd「,」123「]。注意那裏的空元素。 – Dave

+0

@Ilya我認爲空格*是問題,而OP想要相反的結果:'我如何做分割,以便空格不包含在結果中?' –

+0

順便說一下,'split(/ \ s + /)'會產生相同的輸出。 – Ilya