You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ruby中统计大括号间指定字符(N)的数量?

更优的Ruby实现:统计大括号内字符N的数量

嘿,你的这个需求其实挺常见的,但当前的实现确实有不少局限——它只能处理第一个包含{N和N}的片段,要是字符串里有多个大括号块、块内的N不是刚好从{N开始到N}结束,或者大括号里根本没有N,结果要么不对,甚至可能因为index找不到匹配项抛出异常。

下面给你几种更可靠、更通用的实现方式:

方法一:正则匹配+逐块统计(可读性优先)

def count_n_inside_braces(string)
  # 用非贪婪正则匹配所有{}之间的内容,避免跨块匹配
  brace_contents = string.scan(/\{(.*?)\}/).flatten
  # 遍历每个块,统计N的数量并求和
  brace_contents.sum { |content| content.count('N') }
end

逻辑说明:

  1. scan(/\{(.*?)\}/)会找出字符串中所有被{}包裹的内容,.*?是非贪婪匹配,确保不会把{NNN}YYY{XXX}这类字符串错误地当成一个大括号块。
  2. flatten把返回的二维数组(每个匹配是一个单元素数组)转成一维数组,方便后续遍历。
  3. sum方法遍历每个大括号内的内容,用count('N')统计单块内的N数量,最后累加得到总数。

方法二:更紧凑的写法

如果追求代码简洁,可以把逻辑合并成一行(可读性依然不错):

def count_n_inside_braces(string)
  string.scan(/\{(.*?)\}/).sum { |(content)| content.count('N') }
end

测试示例

用你给出的字符串测试:

  • 输入"{NNN}YYY{XXX}NNNN{YYY}" → 返回3(仅第一个块有3个N)
  • 输入"{XXX}NNN{NN}XXX{YYY}" → 返回2(第三个块有2个N)
  • 输入"{XXX}NNNN{YY}AAAA{NNNNNN}" → 返回10(第二个块4个N + 第四个块6个N)

对比原实现的优势

  • 支持多个大括号块的统计,不会只处理第一个匹配片段
  • 鲁棒性更强:即使字符串中没有大括号、或者大括号内没有N,也会返回0,不会抛出异常
  • 统计逻辑更准确:不管N在大括号内的位置如何,都能正确计数,不受{N或N}这类固定开头结尾的限制

内容的提问来源于stack exchange,提问作者Tintin81

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:20:22