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

匹配有效Ruby局部变量名的正则表达式

  •  4
  • kolrie  · 技术社区  · 14 年前

    有人知道有效Ruby变量名的规则吗?它能用正则表达式匹配吗?

    更新:

    ^[_a-z][a-zA-Z0-9_]+$
    

    这看起来对吗?

    7 回复  |  直到 14 年前
        1
  •  8
  •   AboutRuby    14 年前

    标识符非常简单。它们以字母或下划线开头,包含字母、下划线和数字。 变量不能(或者不应该?)以大写字母开头,这样就可以使用这样的正则表达式。

    /^[a-z_][a-zA-Z_0-9]*$/
    
        2
  •  4
  •   Andrew Grimm atk    14 年前

    变量名可能是unicode字母,在这种情况下,大多数现有的正则表达式都不匹配。

    varname = "\u2211" # => "∑" 
    eval(varname + '= "Tony the Pony"') => "Tony the Pony"
    puts varname # => ∑
    local_variable_identifier = /Insert large regular expression here/
    varname =~ local_variable_identifier # => nil
    

    另请参阅Ruby1.9Pickaxe或at中的“使用Unicode的乐趣” Fun with Unicode .

        3
  •  3
  •   rjk    14 年前

    根据 http://rubylearning.com/satishtalim/ruby_names.html Ruby变量包括:

    小写字母或下划线 (“\”),后跟名称字符 数字)。

    此外,全局变量以美元符号开头,实例变量以单个at符号开头,类变量以两个at符号开头。

    一个正则表达式来匹配以下所有内容:

    %r{
      (\$|@{1,2})?  # optional leading punctuation
      [A-Za-z_]     # at least one upper case, lower case, or underscore
      [A-Za-z0-9_]* # optional characters (including digits)
    }x
    

    希望有帮助。

        4
  •  3
  •   kikito    12 年前

    POSIX bracket expressions .

    /^[_[:lower:]][_[:alnum:]]*$/
    

    a-z 实际上比 [:lower:] :

    /^[_a-z][_[:alnum:]]*$/
    
        5
  •  1
  •   DigitalRoss    14 年前

    我想 /^(\$){0,1}[_a-zA-Z][a-zA-Z0-9_]*([?!]){0,1}$/

    这取决于是否也要匹配方法名。

    如果您试图匹配表达式中可能遇到的名称,那么它可能以$开头,也可能以?或者!。如果你确信它只是一个局部变量,那么规则就会简单得多。

        6
  •  1
  •   schpet    8 年前

    wrote this one ,使用 ruby parser 作为参考:

    /\A(?![A-Z0-9])(?:[[:alnum:]_]|[^\0-\177])+\z/
    
        7
  •  0
  •   Jörg W Mittag    14 年前

    就在这里,直接从马嘴里。(本例中的马是 Draft ISO Ruby Specification ):

    • ( 小写字符 | _ ) 标识符字符 *
    • | 大写字符 | _
    • | B类 | D级 电子 | | | | | 日本 | K公司 | | | | | | | | S码 T型 | U型 | | W型 | Z轴
    • 小写字符 b c d | | f 小时 | j | | | n o | | q | r | | u | w | | y z
    • 十进制数字 0 | 1 4 | 5 | 6 7 8 | 9

    在Ruby 1.9中,使用命名组,您可以将其逐字翻译为:

    local_variable_identifier = %r{ 
      (?<uppercase_character>     A | B | C | D | E | F | G | H | I | J | K | L | M
                                | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
      ){0} 
      (?<lowercase_character>     a | b | c | d | e | f | g | h | i | j | k | l | m
                                | n | o | p | q | r | s | t | u | v | w | x | y | z
      ){0} 
      (?<decimal_digit>         0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9){0} 
      (?<identifier_character>    \g<lowercase_character>
                                | \g<uppercase_character>
                                | \g<decimal_digit>
                                | _
      ){0} 
    
      ( \g<lowercase_character> | _ ) \g<identifier_character>*
    }x