如何在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
逻辑说明:
scan(/\{(.*?)\}/)会找出字符串中所有被{}包裹的内容,.*?是非贪婪匹配,确保不会把{NNN}YYY{XXX}这类字符串错误地当成一个大括号块。flatten把返回的二维数组(每个匹配是一个单元素数组)转成一维数组,方便后续遍历。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
相关产品推荐
相关产品推荐

