Регулярное выражение, которое соответствует действительным именам локальных переменных Ruby - PullRequest
4 голосов
/ 06 сентября 2010

Кто-нибудь знает правила для допустимых имен переменных Ruby? Можно ли сопоставить его с помощью RegEx?

ОБНОВЛЕНИЕ: Это то, что я мог придумать до сих пор:

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

Это кажется правильным?

Ответы [ 7 ]

7 голосов
/ 06 сентября 2010

Идентификаторы довольно просты. Они начинаются с букв или подчеркивания и содержат буквы, подчеркивания и цифры. Локальные переменные не могут (или не должны?) Начинаться с заглавной буквы, поэтому вы можете просто использовать регулярное выражение, как это.

/^[a-z_][a-zA-Z_0-9]*$/
4 голосов
/ 08 сентября 2010

Возможно, что имена переменных являются буквами Юникода, в этом случае большинство существующих регулярных выражений не совпадают.

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

См. Также «Fun с Unicode» в кирке Ruby 1.9 или в Fun с Unicode .

3 голосов
/ 25 ноября 2012

Мне нравится ответ @ aboutruby, но, чтобы завершить его, вот эквивалент с использованием выражений в скобках POSIX .

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

Или, поскольку a-z на самом деле короче [:lower:]:

/^[_a-z][_[:alnum:]]*$/
2 голосов
/ 06 сентября 2010

Согласно http://rubylearning.com/satishtalim/ruby_names.html переменная Ruby состоит из:

Имя - это заглавная буква, строчная буква или знак подчеркивания ("_"), за которыми следуют символы имени (это любая комбинация прописных и строчных букв, подчеркивания и цифр).

Кроме того, глобальные переменные начинаются со знака доллара, переменные экземпляра с одним знаком at и переменные класса с двумяat-signs.

Регулярное выражение для сопоставления всего, что будет:

%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

Надеюсь, это поможет.

1 голос
/ 02 октября 2016

Я пытался найти один патч для рельсов, и Мэтью Дрейпер написал этот , используя синтаксический анализатор ruby ​​ в качестве ссылки:

/\A(?![A-Z0-9])(?:[[:alnum:]_]|[^\0-\177])+\z/
1 голос
/ 06 сентября 2010

Я думаю /^(\$){0,1}[_a-zA-Z][a-zA-Z0-9_]*([?!]){0,1}$/ немного ближе к тому, что вам нужно ...

Это зависит от того, хотите ли вы также сопоставить имена методов.

Если вы пытаетесь сопоставить имя, которое может встречаться в выражении, то оно может начинаться с $, а может заканчиваться на? или же !. Если вы точно знаете, что это просто локальная переменная, тогда правило будет намного проще.

0 голосов
/ 06 сентября 2010

И вот оно, прямо изо рта лошади.(Лошадь в этом случае - Черновая спецификация рубина ISO ):

  • идентификатор локальной переменной ( символ нижнего регистра | _ ) символ-идентификатор *
  • символ-идентификатор символ нижнего регистра | символ верхнего регистра | десятичный знак | _
  • символ верхнего регистра 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
  • строчные буквы 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 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

В рубине 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

Конечно, это не так, как вы бы это написали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...