【问题标题】:Search for uppercased substring搜索大写的子字符串
【发布时间】:2015-02-25 16:44:03
【问题描述】:

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

"aaBBBBcBBdDDD"

我需要得到"BBBB"

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

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

差不多了,只是它给出了所有大写字符,而不是最长的序列。

【问题讨论】:

  • 这不是正则表达式可以做的事情。 (至少,这不是正则表达式的设计目的。)
  • 正如@Rawing 所说,这不是 Regexp 的用途。正则表达式非常适合查找看起来类似的东西,但是当出现多个选择时,它们很难找到完全一样的东西,尤其是在有任何回旋余地的情况下。

标签: ruby regex


【解决方案1】:

用正则表达式得到一个大写单词数组,然后用Enumerable#max_by求最长:

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

或更简单:

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

【讨论】:

    【解决方案2】:

    只能通过正则表达式找不到最大长度的字符串。您需要使用一些内置的 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"]
    

    【讨论】:

    • 是的,+ 匹配前一个令牌一次或多次。
    • 如果字符串看起来像这样:aaBBBBAABcBBdDDD 怎么办?它将返回BBBBAAB
    • 是的,它返回BBBBAAB
    • 虽然应该返回相同大写字符的序列。
    • 不要使用sort{|a,b| b.size &lt;=&gt; a.size}sort_by 会更快,因为它会记住中间值,而不是 sort 必须计算 absize 每次通过循环。
    【解决方案3】:

    您没有为超过 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"]
    

    【讨论】:

    • 我不认为tap 在这里给你买任何东西。 imo 写会更清楚:a = "aaBBBBcBBdDDDD".scan(/[[:upper:]]+/); max_length = a.map(&amp;:length).max; a.select { |s| s.size == max_length }.
    • @CarySwoveland 感谢您的回复。可能还有十几个简单构思的选项。我只是不认为需要在其他任何地方都不会使用的多个局部变量。对它们进行基准测试表明它们的性能没有显着差异,它们都在 10% +/-
    【解决方案4】:
    ([A-Z]+)
    

    试试这个。捕获所有组,长度最大的组就是你的答案。查看演示。

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

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多