搜索大写子字符串

时间:2014-12-29 13:29:42

标签: ruby regex

我需要取出大写字符的最长子字符串。所以不在字符串中:

"aaBBBBcBBdDDD"

我需要"BBBB"

是否有方便的Ruby方法或某种正则表达式?我试过了:

string.scan(/[[:upper:]]/)
几乎就是它,它只提供所有大写字符,而不是最长的序列。

4 个答案:

答案 0 :(得分:8)

使用正则表达式获取大写单词数组,然后使用Enumerable#max_by查找最长的单词:

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

或更简单:

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

答案 1 :(得分: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"]

答案 2 :(得分:0)

([A-Z]+)

试试这个。抓住所有小组,最长的小组就是你的答案。见演示。

https://regex101.com/r/gX5qF3/11

答案 3 :(得分:0)

您未指定超过1个相同最大长度的字符串的预期结果。

<@> @ AvinashRaj的答案将处理这个问题,而@ YuHao不会。如果你只想要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"]