Kennt jemand die Regeln für gültige Ruby-Variablennamen? Kann man sie mit einem RegEx abgleichen?
UPDATE: Das ist alles, was mir bisher eingefallen ist:
^[_a-z][a-zA-Z0-9_]+$
Ist das richtig?
Kennt jemand die Regeln für gültige Ruby-Variablennamen? Kann man sie mit einem RegEx abgleichen?
UPDATE: Das ist alles, was mir bisher eingefallen ist:
^[_a-z][a-zA-Z0-9_]+$
Ist das richtig?
Die Identifikatoren sind recht einfach zu handhaben. Sie beginnen mit Buchstaben oder einem Unterstrich und enthalten Buchstaben, Unterstriche und Zahlen. Lokales Variablen können (oder sollten?) nicht mit einem Großbuchstaben beginnen, so dass Sie einfach eine Regex wie diese verwenden können.
/^[a-z_][a-zA-Z_0-9]*$/
Es ist möglich, dass Variablennamen aus Unicode-Buchstaben bestehen. In diesem Fall passen die meisten der vorhandenen Regexe nicht.
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
Siehe auch "Fun with Unicode" entweder in der Ruby 1.9 Pickaxe oder unter Spaß mit Unicode .
Según http://rubylearning.com/satishtalim/ruby_names.html eine Ruby-Variable besteht aus:
Ein Name ist ein Großbuchstabe, Kleinbuchstabe oder ein Unterstrich ("_"), gefolgt von den Zeichen Name (dies ist eine beliebige Kombination aus Groß- und Kleinbuchstaben, Unterstrich und Ziffern).
Außerdem beginnen globale Variablen mit einem Dollarzeichen, Instanzvariablen mit einem einzelnen at-Zeichen und Klassenvariablen mit zwei at-Zeichen.
Ein regulärer Ausdruck, der auf all dies passt, wäre:
%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
Ich hoffe, das hilft.
Mir gefällt die Antwort von @aboutruby, aber der Vollständigkeit halber hier die Entsprechung mit POSIX-Klammerausdrücke .
/^[_[:lower:]][_[:alnum:]]*$/
Oder, da a-z
ist tatsächlich kürzer als [:lower:]
:
/^[_a-z][_[:alnum:]]*$/
Ich denke /^(\$){0,1}[_a-zA-Z][a-zA-Z0-9_]*([?!]){0,1}$/
ist ein bisschen näher an dem, was Sie brauchen...
Es hängt davon ab, ob Sie auch die Methodennamen abgleichen wollen.
Wenn Sie versuchen, einen Namen zu finden, der in einem Ausdruck vorkommen könnte, dann könnte er mit $ beginnen und mit ? oder ! enden. Wenn Sie sicher wissen, dass es sich nur um eine lokale Variable handelt, wird die Regel viel einfacher sein.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.