代码之家  ›  专栏  ›  技术社区  ›  Blankman

如何在数字的第一个实例之前获取所有前导字符

  •  0
  • Blankman  · 技术社区  · 14 年前

    我的产品代码看起来像:

    abc123
    abcd23423
    

    abc
    abcd
    

    最好的方法是什么?

    4 回复  |  直到 14 年前
        1
  •  2
  •   nonopolarity    14 年前
     "abc123 abcd23423".scan(/(\D*)\d+/)
      => [["abc"], [" abcd"]]
    
     "abc123 abcd23423".scan(/(\D*)\d+/).join
      => "abc abcd"
    
        2
  •  0
  •   steenslag    14 年前
    'abc123 abcd23423'.split(/\d+/).join
    

    或者只是

    'abc123 abcd23423'.gsub(/\d+/,'')
    
        3
  •  0
  •   Andrew Grimm atk    14 年前
    DATA.each do |l|
      chars = l[/^([[:alpha:]]+)/, 1] # [:alpha:] = [a-zA-Z]
      puts chars
    end
    
    __END__
    abc123
    abcd23423
    
    # >> abc
    # >> abcd
    

    ary = []
    DATA.each do |l|
      ary << l[/^([[:alpha:]]+)/, 1] # [:alpha:] = [a-zA-Z]
    end
    ary # => ["abc", "abcd"]
    
    __END__
    abc123
    abcd23423
    

    我没用 \D 因为它意味着所有的非数字(又名 [^0-9]

    'abc_-$%#123'[/^(\D+)/, 1] # => "abc_-$%#"
    

    出于同样的原因 \w

    'abc_-$%#123'[/^(\w+)/, 1] # => "abc_"
    

    [[:alpha:]] 是字母表字符 [a-zA-Z]

    'abc_-$%#123'[/^([a-zA-Z]+)/, 1] # => "abc"
    'abc_-$%#123'[/^([[:alpha:]]+)/, 1] # => "abc"
    
        4
  •  0
  •   Aaa    14 年前

    可以使用正则表达式来检测字符串的开头( \A \D* )尽可能( * 默认情况下是贪婪的):

    processed_codes = codes.map { |code| code.scan(/\A(\D*)/)[0] }
    

    你也可以使用 String#match

    推荐文章