如何计算字符串开头的零的数量

4

我有一个字符串:

"0011HelloWor00ld001"

如何计算字符串开头的零的数量?例如,上面的字符串应该返回2。
我尝试过.match(/^[0]+/)。size,但它不起作用。

2
你需要使用 "0011HelloWor00ld001"[/^0+/].size - Wiktor Stribiżew
3个回答

7

.match(/^0+/)会返回一个MatchData对象,因此你会得到1作为结果(它表示匹配数组中元素的数量)。

你需要获取匹配本身的大小。使用以下其中之一:

"0011HelloWor00ld001".match(/^0+/)[0].size
"0011HelloWor00ld001"[/^0+/].size
"0011HelloWor00ld001".match(/^0+/).to_s.size

我注意到你经常使用行尾锚点^$,而其他人可能会使用字符串末尾锚点\A\z。既然这显然是有意为之的,我很想知道你对此的想法是什么。 - Cary Swoveland
如果你是指我,我使用了OP代码。我只关注主要问题。当然,在Ruby中匹配字符串的开头应该使用\A - Wiktor Stribiżew
2
^$更古老、更常见,因此它们更常被使用。在我从事编程的这些年里,我只有在几次情况下需要使用\A\z来替代^/$。大多数时候我在搜索包含单行的字符串,所以这没有任何区别,我会回到首先想到的方法。 - the Tin Man

4
您也可以简单地使用String的index方法,如下所示:
str = '0011HelloWor00ld001'
# as noted by @steenslag if the full string is zeros index will return nil
# solve by returning full string length
str.index(/[^0]/) || str.length 
#=> 2 

有趣的方法,尽管第一个非0的索引等于前导0的数量可能不是很明显。 - Stefan

1

我最喜欢@Wiktor的中间答案,但这里还有三个。

#1

def nbr_leading_zeros(str)
  str.split(/[^0]/).first.size
end

nbr_leading_zeros '0011Hello00'    #=> 2
nbr_leading_zeros '101'            #=> 0
nbr_leading_zeros '000'            #=> 3

#2

def nbr_leading_zeros(str)
  str.each_char.take_while { |c| c=='0' }.size
end

#3

def nbr_leading_zeros(str)
  str.match(/\A0*/)&.end(0).to_i
end

我最初也写了.first,但那时列表已经很长了。 :) - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接