Ruby 如何验证字符串中的最后一个字符是否为数字

Ruby 如何验证字符串中的最后一个字符是否为数字,ruby,Ruby,我需要检查字符串中的最后一个字符是否是数字,如果是,则递增它 我有一个目录结构/u01/app/oracle/…,这就是它不正常的地方。有时以版本号结尾,有时以dbhome\u 1(或2,或3)结尾,有时,我不得不假设,它将采用其他形式。如果它以dbhome\u X结尾,我需要解析它,如果它是一个数字,我就要碰撞最后一个数字 我使用split分割“/”上的目录结构,并使用include?检查最后一个元素是否类似于“dbhome”。只要我的目录结构以dbhome\u X结尾,它似乎就可以工作。但是

我需要检查字符串中的最后一个字符是否是数字,如果是,则递增它

我有一个目录结构
/u01/app/oracle/…
,这就是它不正常的地方。有时以版本号结尾,有时以
dbhome\u 1
(或
2
,或
3
)结尾,有时,我不得不假设,它将采用其他形式。如果它以
dbhome\u X
结尾,我需要解析它,如果它是一个数字,我就要碰撞最后一个数字

我使用
split
分割“/”上的目录结构,并使用
include?
检查最后一个元素是否类似于“dbhome”。只要我的目录结构以
dbhome\u X
结尾,它似乎就可以工作。但是,在测试时,我尝试了一个以
dbhome
结尾的路径,发现最后一个字符是数字的检查无效

db_home = '/u01/app/oracle/product/11.2.0/dbhome'

if db_home.split('/')[-1].include?('dbhome')
  homedir=db_home.split('/')[-1]
  if homedir[-1].to_i.is_a? Numeric
    homedir=homedir[0...-1]+(homedir[-1].to_i+1).to_s
    new_path="/"+db_home.split('/')[1...-1].join("/")+"/"+homedir.to_s
  end
else
  new_path=db_home+"/dbhome_1"
end

puts new_path
我没有料到输出是
/u01/app/oracle/11.2.0/product/dbhom1
——它似乎落入了
if
块,该块将
1
添加到了最后一个字符中


如果我将初始路径设置为
/u01/app/../dbhome\u 1
,我将得到预期的
/u01/app/../dbhome\u 2
作为输出。

您可以使用正则表达式使匹配稍微容易一些

if!!(db_home[/.*dbhome.*\z])…

您可以使用正则表达式

/[0-9]$/.match("How3").nil?
我需要检查字符串中的最后一个字符是否为数字,以及 所以,增加它

这是一种选择:

s = 'string9'

s[-1].then { |last| last.to_i.to_s == last ? [s[0..-2], last.to_i+1].join : s }

#=> "string10"


如果您正在运行Ruby v2.6+,这是一个起点:

fname = 'filename1'

fname[/\d+$/].then { |digits|
  fname[/\d+$/] = digits.to_i.next.to_s if digits
}

fname # => "filename2"
如果文件名不以数字结尾,则是安全的:

fname = 'filename'

fname[/\d+$/].then { |digits|
  fname[/\d+$/] = digits.to_i.next.to_s if digits
}

fname # => "filename"
我不确定我是否喜欢这样做,而不是用更传统的方式来处理更老的红宝石:

digits = fname[/\d+$/]
fname[/\d+$/] = digits.to_i.next.to_s if digits
除了只使用一次后,
数字
就会卡在变量空间中。不过,在我的代码中可能会发生更糟糕的事情


这是在利用字符串和方法。

String#to#i
如果字符串不是以数字开头,则返回0。“/u01/app/11.2.0/dbhome9”。succ#=>“/u01/app/11.2.0/dbhomf0”,但“/u01/app/11.2.0/dbhome##9.such=”/u01/app/11.2.0/dbhome#10”。“我自己很惊讶。”steenslag,医生确认了第一个的行为,但没有确认第二个的行为。我总是犹豫是否认为某些行为是Ruby bug,但我无法解释它。这与我的回答无关。对吧?我想这只是鲁比想表现得好。我在试图改进你的答案时发现了这一点;这不是批评,很有趣。文档中可能有一条线索:“递增的非字母数字使用基础字符集的排序序列。如果增量生成“进位”,则其左侧的字符将递增。此过程将重复,直到没有进位为止,必要时添加一个附加字符。”?如果没有“进位”在一个非字母数字字符集的排序序列中,可能右边的字母数字字符会根据需要递增。我发现
'*z9'.succ
返回
'*aa0'
,而
'*'.succ
返回
'+'
(续)我还发现,
'*z9*
.succ`returns
'*aa0*
,以及其他测试。因此,如果存在非字母数字字符和字母数字字符的组合,
succ
将增加不被任何非字母数字字符中断的最右边字母数字字符序列,而如果没有字母数字字符,则C字符,<代码> SUCK将增加最右边的非字母数字字符的<代码> ORD < /Cord>值,并返回结果字符。这里是露比业余爱好者。我倾向于认为ReXEP是最后的工具,因为(至少在SQL中)它比其他匹配选项更昂贵。不幸的是,我对ruby太陌生了-不确定这是否是一个完整的示例,或者…但是如果我用它替换我的第一个if,我会得到一个"警告:正则表达式有']'而没有转义:/.*dbhome.*\z])@stephan,这是思考正则表达式的正确方法。请参阅我使用不同版本的Ruby和各种变体进行的有关如何搜索文本的一些实验。Regex功能非常强大,如果小心使用,可以大大减少编写的代码。如果使用不当,则可能会导致错误引入bug,使程序陷入爬行或崩溃,这两种方式都极难调试。大多数人将它们视为学习时使用的神奇灵丹妙药或锤子。它们只是工具箱中用于外科手术的另一种工具。我没有第一个选择——它抱怨说“然后”是字符串的未定义方法。但是“更传统”选项似乎工作得很好。显然,我还有很多东西要学习。谢谢!您的Rubyfname = 'filename' fname[/\d+$/].then { |digits| fname[/\d+$/] = digits.to_i.next.to_s if digits } fname # => "filename"
digits = fname[/\d+$/]
fname[/\d+$/] = digits.to_i.next.to_s if digits