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%以内+/-