【问题标题】:Ruby Regex - If the string is more than 10 characters, remove the first character if it is a "1"Ruby Regex - 如果字符串超过 10 个字符,则删除第一个字符(如果它是“1”)
【发布时间】:2021-04-11 16:49:20
【问题描述】:

如果不使用 gem,我只想编写一个简单的正则表达式公式来删除字符串中的第一个字符(如果它是 1),并且如果字符串中的总字符数超过 10 个。我从没想过超过 11 个字符,11 应该是最大值。但是如果有10个字符并且字符串以“1”开头,我不想删除它。

str = "19097147835"
str&.remove(/\D/).sub(/^1\d{10}$/, "\1").to_i

返回0

我正在寻找它返回“9097147835”

【问题讨论】:

    标签: regex ruby


    【解决方案1】:

    非正则表达式示例:

    str = str[1..] if (str.start_with?("1") and str.size > 10)
    

    正则表达式功能强大,但不易维护。

    【讨论】:

      【解决方案2】:

      您可以使用您的模式,但在 10 位数字周围添加一个捕获组以在替换中使用该组。

      \A1(\d{10})\z
      

      例如

      str = "19097147835"
      puts str.gsub(/\D/, '').sub(/\A1(\d{10})\z/, '\1').to_i
      

      输出

      9097147835
      

      另一种选择是删除所有非数字,并匹配最后 10 个数字:

      \A1\K\d{10}\z
      
      • \A 字符串开始
      • 1\K 匹配 1 并忘记到目前为止匹配的内容
      • \d{10} 匹配 10 位数字
      • \z 字符串结束

      Regex demo | Ruby demo

      str = "19097147835"
      str.gsub(/\D/, '').match(/\A1\K\d{10}\z/) do |match|
          puts match[0].to_i
      end
      

      输出

      9097147835
      

      【讨论】:

        【解决方案3】:

        你可以使用

        str.gsub(/\D/, '').sub(/\A1(?=\d{10})/, '').to_i
        

        请参阅Ruby demoregex demo

        正则表达式匹配

        • \A - 字符串开头
        • 1 - 一个1
        • (?=\d{10}) - 当前位置的右侧,必须有 10 位数字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-27
          • 1970-01-01
          • 2015-09-25
          • 2018-08-05
          • 2017-01-10
          相关资源
          最近更新 更多