2015-05-29 3 views
1

Я хочу создать регулярное выражение для соответствия символам ruby, но мне нужно знать, что такое точный синтаксис для символа.Что может содержать символ рубина (синтаксис)?

До сих пор я отдаю себе отчет в следующем:

:'string' 
:"string" 
:__underline 
:method 
:exclamation! 
:question? 
:@instance 
:$global 
+0

Почему вы хотите совместить символы с регулярным выражением? –

+4

Извините мое невежество, но если вы можете использовать ': 'любую строку'', то, несомненно, что-либо, что действительно в строке, допустимо в символе. – Armand

+0

Я делаю это для шаблонов двигателя. –

ответ

5

Не совсем понятно, о чем вы говорите.

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

Если говорить о различных способах написания Symbol литералов, вот мое лучшее понимание:

  • голой : буквальным: любой допустимый идентификатор Ruby (например, :foo, :Foo, :@foo, :@@foo, :$foo, :$:, ...)
  • одинарная котировка : буквально: все, что действительно в одном кавычках String, включая escape-последовательности, такие как :'\'' и :'\\'
  • двойных кавычек : буквальные: все это действует в двойных кавычках String буквальных, в том числе управляющих последовательностями, такие как :"\"", :"\\" и :"\n", а также интерполяции строк, который позволяет вводить результаты произвольного кода Ruby, в Symbol, например :"#{if rand < 0.5 then RUBY_VERSION else ENV['HOME'] end}"
  • одиночные кавычки Array из Symbol сек буквальным: все, что это действует в одинарных кавычках Array из String с буквальным, например, %i|foo bar baz| (эквивалент [:foo, :bar, :baz]) %i(foo\ bar baz) (эквивалент [:'foo bar', :baz]), %i:foo bar: (эквивалент [:foo, :bar])
  • двойных кавычек Array из Symbol сек буквального: все, что это действует в двойных кавычках Array из String с буквальным, например, %I|foo #{bar} baz| и т. Д.
  • Symbol хэш-ключи в синтаксисе key: value: каждая действительная метка Ruby, например. {foo: 42}
  • Symbol хэш-ключи в цитированном 'key': value синтаксисе: каждый действительный Ruby String литерал, включая escape-последовательности и интерполяцию, например.{"foo\n#{bar}": 42}

Есть, конечно, много других выражений, которые оценивают в Symbol с:

  • определение метода выражения: def foo;end # => :foo
  • String#to_sym (псевдоним String#intern): 'foo bar'.to_sym # => :'foo bar'
  • действительно, любой способ, который может return a Symbol
+0

Очень подробное объяснение. Большое спасибо! Я принял ваш ответ как правильный, так как вижу, что вы много работали над этим, и вы ответили на мой вопрос лучше всего. –

2

http://www.cse.buffalo.edu/~regan/cse305/RubyBNF.pdf перебирает контекстно-свободной грамматики производств, которые определяют синтаксис Руби. CFGs по своей сути более эффективны, чем RE, поэтому вы можете рассмотреть другой инструмент для этой работы, но вы можете, конечно, посмотреть на этот документ и попытаться создать регулярное выражение, соответствующее всем случаям.

+0

Именно то, что я искал! Большое спасибо. Я создаю свой собственный парсер для системы шаблонов, поэтому теперь я могу правильно интегрировать встроенный рубин. –

Смежные вопросы