Ruby 搜索大写的子字符串

Ruby 搜索大写的子字符串,ruby,regex,Ruby,Regex,我需要去掉大写字符的最长子字符串。因此,出格地: "aaBBBBcBBdDDD" 我需要得到“BBBB” 是否有一个方便的Ruby方法或某种类型的regexp?我试过: string.scan(/[[:upper:]]/) 差不多就是这样,只是它给出了所有大写字符,而不是最长的序列 ([A-Z]+) 试试这个。捕获所有组,其中长度最大的组就是您的答案。请参阅演示 您无法通过正则表达式找到具有最大长度的字符串。您需要使用一些内置的Ruby函数 > m = "aaBBBBcBBdDDD"

我需要去掉大写字符的最长子字符串。因此,出格地:

"aaBBBBcBBdDDD"
我需要得到
“BBBB”

是否有一个方便的Ruby方法或某种类型的regexp?我试过:

string.scan(/[[:upper:]]/)
差不多就是这样,只是它给出了所有大写字符,而不是最长的序列

([A-Z]+)
试试这个。捕获所有组,其中长度最大的组就是您的答案。请参阅演示


您无法通过正则表达式找到具有最大长度的字符串。您需要使用一些内置的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"]
>m=“aabbcbbdddd”。扫描(/[:upper:]+/)
=>[“BBBB”、“BB”、“DDD”]
>vc=m.sort{| a,b | b.size a.size}
=>[“BBBB”、“DDD”、“BB”]
>如果{a | a.size[“BBBB”]

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

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

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

您没有为多个相同最大长度的字符串指定预期结果

@AvinashRaj的回答可以解决这个问题,而@YuHao的回答不会。如果你只想要一个结果,我会建议@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"]
“aabbcbbdddd”。扫描(/[:upper:][]+/)。点击do | a |
max_length=a.map(&:length).max
a、 如果{124; x | x.length[“BBBB”,“DDDD”]

这不是正则表达式所能做到的。(至少,这不是regex设计的目的。)正如@Rawing所说,这不是Regexp的目的。正则表达式很擅长发现看起来像东西的东西,但当有多选时,它们很难找到真正的东西,特别是在有回旋余地的情况下。是的,
+
匹配上一个令牌一次或多次。如果字符串如下所示:
aabbbbaabcbbddd
?它将返回
BBBBAAB
yep,它返回
BBBBAAB
I,尽管应该返回相同的大写字符序列。不要使用
sort{a,b | b.size a.size}
sort\u by
会更快,因为它会记住中间值,而不是
sort
必须计算
a
b
size
每次通过循环。我认为
tap
在这里买不到任何东西。依我看,这样写会更清楚:
a=“aabbcbbdddd”.scan(/[:upper:][]+/);max_length=a.map(&:length).max;a、 选择{s | s.size==max_length}
@caryswovel,感谢您的回复。对于这一点,可能还有十几种更简单的设想。我只是不认为需要多个局部变量,而这些变量在其他任何地方都不会被使用。对它们进行基准测试表明,它们的性能没有显著差异,或者它们都在10%以内+/-