【问题标题】:How to find last occurrence of a number in a string using Ruby?如何使用 Ruby 查找字符串中最后一次出现的数字?
【发布时间】:2009-10-17 14:29:38
【问题描述】:

使用 Ruby... 给出以下字符串:

x = "blah_blah.do.dah[4543]junk_junk"

如何删除最后一个数字/数字之后的所有文本?

我认为最简单的方法可能是找到最后一次出现的索引,然后删除该索引之后的所有内容。但是,我似乎无法弄清楚如何获得该索引。我所有使用正则表达式的尝试都失败了。

【问题讨论】:

    标签: ruby regex string


    【解决方案1】:

    有如何做你需要的答案

    还可以找到最后出现的数字:

    x = 'blah_blah.do.dah[4543]junk_junk'
    x.rindex(/\d/)
    

    【讨论】:

    • 谢谢。出于某种原因,我尝试了它……我的语法一定有点不正确。将此与 gsub 结合使用效果很好。
    【解决方案2】:

    这可能是您正在寻找的正则表达式:

    s/\D*$//
    

    此正则表达式匹配字符串末尾的所有非数字,从最后一个数字或字符串的开头(如果它根本不包含任何数字)开始,并删除匹配的任何内容。更准确地说,\D* 是一个 greedy 匹配尽可能多的非数字(零或更多)。 $ 代表字符串的结尾。

    在 Ruby 中,您可以使用字符串的 gsub 方法使用正则表达式进行搜索和替换:

    x = 'blah_blah.do.dah[4543]junk_junk'
    y = x.gsub(/\D*$/, '')
    

    有关正则表达式和 Ruby 的更多信息,请参阅regular-expressions.info

    【讨论】:

    • 你可能只想要 /\D+$/ (或 /\D+\Z/)——OP 想从末尾去掉非数字。
    【解决方案3】:

    总而言之,这似乎是做我需要的最干净、最简单的方法。感谢大家为我指明正确的方向!

    index = file.rindex(/\d/)
    if(index) then
        p file[0 , index+1]
    end
    

    【讨论】:

      【解决方案4】:

      这个正则表达式应该可以工作:

      (.*(?=\d)\d)[^\d]*$
      

      你应该使用类似的东西:

      result = your_text.gsub(/(.*(?=\d)\d)[^\d]*$/, '\\1')
      

      解释:

      • (.*(?=\d)\d) 是你要保存的那组东西
        • .* . 是除了换行符之外的所有内容,* 表示 0 次或多次
        • (?=\d) 表示直到你能够匹配 \d 这是一个数字
        • \d 表示也匹配该数字!
      • [^\d]+$ 是你不想保存的部分
        • [^\d]* 中匹配任何与\d 不匹配的内容,并且* 再次出现0 次或更多次
        • $ 是行尾

      另一种方法是简单地将[^\d]+$ 替换为空

      【讨论】:

        【解决方案5】:

        我假设你想在数字后面加上最后一个 ']'

        这是我的答案:

        Original_Text = "blah_blah.do.dah[4543]junk_junk"
        Result___Text = Original_Text.gsub(Regexp.new("(.*\\[[0-9]+\\])[^0-9]*$"), '\1')
        puts Result___Text
        

        如果没有,试试这个:

        Original_Text = "blah_blah.do.dah[4543]junk_junk"
        Result___Text = Original_Text.gsub(Regexp.new("(.*[0-9]+)[^0-9]*$"), '\1')
        puts Result___Text
        

        【讨论】:

        • 带有LeadingCapital的变量名在Ruby中被认为是常量。
        【解决方案6】:
        irb(main):068:0> "blah_blah.do.dah[4543]junk_junk".match(/(.+\d)/)[1]
        => "blah_blah.do.dah[4543"
        

        【讨论】:

          【解决方案7】:
          puts "blah_blah.do.dah[4543]junk_junk"[/.*\d+/]
          #returns "blah_blah.do.dah[4543"
          

          使用 rindex:

          x = "blah_blah.do.dah[4543]junk_junk"
          x.rindex(/\d/)
          puts "#{$`}#{$&}"
          #also returns "blah_blah.do.dah[4543"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-10-31
            • 1970-01-01
            • 2011-03-09
            • 1970-01-01
            • 2012-03-23
            • 1970-01-01
            • 2021-03-19
            相关资源
            最近更新 更多