正则表达式匹配有效的Ruby本地变量名称

时间:2010-09-06 01:29:26

标签: ruby regex variables

有没有人知道有效Ruby变量名的规则?可以使用RegEx进行匹配吗?

更新:这是我到目前为止所能提出的:

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

这看起来是对的吗?

7 个答案:

答案 0 :(得分:7)

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

/^[a-z_][a-zA-Z_0-9]*$/

答案 1 :(得分:4)

变量名称可能是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

另请参阅Ruby 1.9 Pickaxe或Fun with Unicode中的“Fun with Unicode”。

答案 2 :(得分:3)

我喜欢@ aboutruby的答案,但只是为了完成它,这里是使用POSIX bracket expressions的等价物。

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

或者,因为a-z实际上比[:lower:]短:

/^[_a-z][_[:alnum:]]*$/

答案 3 :(得分:2)

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

  

名称是大写字母,   小写字母或下划线   (“_”),后跟名称字符   (这是鞋帮和鞋帮的任意组合   小写字母,下划线和   位)。

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

匹配所有内容的正则表达式:

%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 :(得分:1)

我认为/^(\$){0,1}[_a-zA-Z][a-zA-Z0-9_]*([?!]){0,1}$/更接近你需要的东西......

这取决于您是否也想匹配方法名称。

如果您尝试匹配表达式中可能遇到的名称,那么它可能以$开头并且可能以?结尾?要么 !。如果您确定它只是一个局部变量,那么该规则将更加简单。

答案 5 :(得分:1)

我试图用一个导轨补丁计算一个,而Matthew Draper wrote this one使用ruby parser作为参考:

/\A(?![A-Z0-9])(?:[[:alnum:]_]|[^\0-\177])+\z/

答案 6 :(得分:0)

就在这里,直接来自马的嘴。 (在这种情况下,马是Draft ISO Ruby Specification):

  • local-variable-identifier ( 小写字符 | _ ) < strong>标识符字符 *
  • 标识符字符小写字符 | 大写字符 | 十进制数字 | _
  • 大写字符 A | B | C {{ 1}} D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
  • 小写字符 a | b | c {{ 1}} d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
  • 十进制数字 0 | 1 | 2 {{ 1}} 3 | 4 | 5 | 6 | 7 | 8 | 9

在Ruby 1.9中,使用命名组,您可以按字面翻译:

|

当然,这不是你真正写它的方式。