2014-12-29 174 views
0

我需要取出大寫字符的最長子字符串。所以出字符串:搜索大寫字符串

"aaBBBBcBBdDDD" 

我需要得到"BBBB"

有沒有一種方便的Ruby方法或某種正則表達式?我試過了:

string.scan(/[[:upper:]]/) 

這就差不多了,只是它給出了所有的大寫字母,而不是最長的序列。

+1

這不是正則表達式可以做的事情。 (至少,這不是正則表達式的設計目的。) –

+0

正如@Rawing所說,這不是Regexp的用處。正則表達式非常適合尋找*看起來像某事物的東西,但是當發現某些事物時,如果有多種選擇,特別是在有任何擺動空間的情況下,它們是非常糟糕的。 –

回答

1

你找不到,只有通過正則表達式有最大長度的字符串。您需要使用一些內置的Ruby功能。

> m = "aaBBBBcBBdDDD".scan(/[[:upper:]]+/) 
=> ["BBBB", "BB", "DDD"] 
> vc = m.sort{|a,b| b.size <=> a.size} 
=> ["BBBB", "DDD", "BB"] 
> vc.delete_if{|a| a.size < vc.first.size} 
=> ["BBBB"] 
+0

謝謝你,那個「+」就是我所缺少的:) – Leo

+0

是的,'+'匹配一次或多次前一個標記。 –

+0

如果字符串看起來像這樣:'aaBBBBAABcBBdDDD'?它會返回'BBBBAAB' – hek2mgl

8

使用正則表達式來獲得的大寫單詞的數組,然後使用Enumerable#max_by找到最長:

"aaBBBBcBBdDDD".scan(/[[:upper:]]+/).max_by {|x| x.length} 
# => "BBBB" 

或簡單:

"aaBBBBcBBdDDD".scan(/[[:upper:]]+/).max_by(&:length) 
# => "BBBB" 
0

沒有指定爲預期成果超過1個相同最大長度的字符串。

@AvinashRaj的回答將會處理這個,而@餘浩的答案不會。如果你只想要1個結果,我會建議@ YuHao的答案,如果你想要所有的結果,我會改變@ AvinashRaj的答案是這樣的。

"aaBBBBcBBdDDDD".scan(/[[:upper:]]+/).tap do |a| 
    max_length = a.map(&:length).max 
    a.delete_if{|x| x.length < max_length } 
end 
#=> ["BBBB","DDDD"] 
+0

我不認爲'tap'會在這裏買到任何東西。這會更清晰地寫出:'a =「aaBBBBcBBdDDDD」.scan(/ [[:upper:]] + /); max_length = a.map(&:length).max; a.select {| s | s.size == max_length}'。 –

+0

@CarySwoveland謝謝你的回覆。這可能有十幾個簡單的設想選項。我只是沒有看到需要多個局部變量,這些變量不會在其他地方使用。對他們進行基準比較,結果顯示他們的表現沒有顯着差異,他們都在10% – engineersmnky