2016-03-26 84 views
0

我有一個字和一個數字的字符串。我想通過單詞分割字符串。例如,從數字之間抓取整個詞

"100 1990 top 1000 500" #=> ["100 1990 ", "top", " 1000 500"] 

我認爲這會工作,但不會:

'100 1990 top 1000 500'.partition(/[\ba-zA-Z\b]/) # => ["100 1990 ", "t", "op 1000 500"] 

然而,使用Rubular,正則表達式上面並匹配整個字"top"(只有這個詞)給出上面的字符串。

我錯過了什麼?

+0

嘗試在字符串上使用'split'方法。 – Ilya

+0

'/ [\ ba-zA-Z \ b] /'不正確。你想要'/ \ b [a-zA-Z] \ b /'。 –

+0

@TheTinMan,你忘了'+',我不認爲你想要分詞。 –

回答

0

在這個特殊的例子,沒有必要使用正則表達式通常是比較慢比較簡單的字符串方法:

split不正是你所需要的:

'1990 top 1000'.split 
#=> ["1990", "top", "1000"] 

如果你有興趣在串字上的每一面,你可能想用這個詞作爲參數傳遞給split

'1990 top 1000'.split('top') 
#=> ["1990 ", " 1000"] 

或者只是使用這個正則表達式:

'1990 top 1000'.partition /\b[a-zA-Z]+\b/ 
#=> ["1990 ", "top", " 1000"][ 

由於Wiktor的提到這個正則表達式不會匹配不在A-Z範圍內的字符。爲了匹配Unicode字符就好了,SS或C你可能想使用[[:alpha:]]字符類:

'1990 äop 1000'.partition /\b[[:alpha:]]+\b/ 
#=> ["1990 ", "äop", " 1000"] 

瞭解更多關於Regexp character classes

+0

感謝您的回覆,但我需要分區。我想分離出單詞兩邊的子字符串。 – sarkon

+0

但我不知道這個詞會成爲'頂部'。我只知道在任何一邊都會有一個(整個)字。 – sarkon

+0

太棒了!我需要學習正則表達式。仍然留下爲什麼它不適用於Rubular的問題。有沒有更好的Ruby正則表達式編輯器? – sarkon

0

你的正則表達式匹配一個符號,無論是\b(退格鍵,它不是一個單詞邊界,因爲\b字符類中失去了它的特殊含義,就像變成一個轉義序列)或ASCII字母(一個來自a-zA-Z範圍)。所以,rubular.com顯示你有3個單獨的比賽。您可以通過將捕獲組置於您的模式上來自行檢查它(請參閱your regex demo)。

您可以使用正則表達式/\p{L}+/partition(即1個或多個字母匹配):

'1990 top 1000'.partition(/\p{L}+/) 

IDEONE demo

如果你的字符串只包含1個字,這應該工作。順便說一句,\p{L}匹配任何Unicode字母,不只是ASCII

0

很難回答你「丟失」的內容,但是你可能誤解的是正則表達式中的字符範圍[]。它表示一個字符。 [\ba-zA-Z\b]表示單詞邊界,小寫字母或大寫字母(或冗餘地,單詞邊界)。你正在用一個這樣的角色分區,這不是你想要的。

+0

請參閱@ Wiktor關於字符類中'\ b'處理的註釋。例如'「abc def」.partition([/ b /])#=> [「abc def」,「」,「」]',這是每當'partition'不匹配時返回的值的論點。什麼是'\ b'? '放入'貓\ b和狗'#=>貓和狗'。 –

+0

@CarySwoveland你的意思是'/ [\ b] /',我想。而'\ b'在字符串中沒有意義。它在正則表達式中很有意義。 – sawa

+0

是的,我的意思是'/ [\ b] /'。誠然,它在正則表達式中有特殊的含義,只要它不在字符類中。一個字符串中的'\ b'被放在一旁。 '「\ b」.ord#=> 8'(「backspace」)。這對我來說是新的(或者是我已經忘記的東西)。 –

相關問題