有没有人知道有效Ruby变量名的规则?可以使用RegEx进行匹配吗?
更新:这是我到目前为止所能提出的:
^[_a-z][a-zA-Z0-9_]+$
这看起来是对的吗?
答案 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):
(
小写字符 |
_ )
< strong>标识符字符 *
|
大写字符 |
十进制数字 |
_ |
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 |
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 |
1 |
2 {{ 1}} 3 |
4 |
5 |
6 |
7 |
8 |
9 在Ruby 1.9中,使用命名组,您可以按字面翻译:
|
当然,这不是你真正写它的方式。