5 Stimmen

Regex, der auf gültige lokale Ruby-Variablennamen passt

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?

8voto

AboutRuby Punkte 7806

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]*$/

4voto

Andrew Grimm Punkte 73882

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 .

3voto

rjk Punkte 1432

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.

3voto

kikito Punkte 49986

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:]]*$/

1voto

DigitalRoss Punkte 138823

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.com

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.

Powered by:

X