我需要取出大寫字符的最長子字符串。所以出字符串:搜索大寫字符串
"aaBBBBcBBdDDD"
我需要得到"BBBB"
。
有沒有一種方便的Ruby方法或某種正則表達式?我試過了:
string.scan(/[[:upper:]]/)
這就差不多了,只是它給出了所有的大寫字母,而不是最長的序列。
我需要取出大寫字符的最長子字符串。所以出字符串:搜索大寫字符串
"aaBBBBcBBdDDD"
我需要得到"BBBB"
。
有沒有一種方便的Ruby方法或某種正則表達式?我試過了:
string.scan(/[[:upper:]]/)
這就差不多了,只是它給出了所有的大寫字母,而不是最長的序列。
你找不到,只有通過正則表達式有最大長度的字符串。您需要使用一些內置的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"]
使用正則表達式來獲得的大寫單詞的數組,然後使用Enumerable#max_by
找到最長:
"aaBBBBcBBdDDD".scan(/[[:upper:]]+/).max_by {|x| x.length}
# => "BBBB"
或簡單:
"aaBBBBcBBdDDD".scan(/[[:upper:]]+/).max_by(&:length)
# => "BBBB"
沒有指定爲預期成果超過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"]
我不認爲'tap'會在這裏買到任何東西。這會更清晰地寫出:'a =「aaBBBBcBBdDDDD」.scan(/ [[:upper:]] + /); max_length = a.map(&:length).max; a.select {| s | s.size == max_length}'。 –
@CarySwoveland謝謝你的回覆。這可能有十幾個簡單的設想選項。我只是沒有看到需要多個局部變量,這些變量不會在其他地方使用。對他們進行基準比較,結果顯示他們的表現沒有顯着差異,他們都在10% – engineersmnky
這不是正則表達式可以做的事情。 (至少,這不是正則表達式的設計目的。) –
正如@Rawing所說,這不是Regexp的用處。正則表達式非常適合尋找*看起來像某事物的東西,但是當發現某些事物時,如果有多種選擇,特別是在有任何擺動空間的情況下,它們是非常糟糕的。 –