我想创建正则表达式来匹配ruby符号,但我需要知道符号的确切语法是什么。
到目前为止,我知道以下内容:
:'string'
:"string"
:__underline
:method
:exclamation!
:question?
:@instance
:$global
答案 0 :(得分:5)
你所说的还不完全清楚。
如果你在讨论Symbol
可以包含什么,答案是:任何东西,包括换行符,任意空格,控制字符,任意奇怪和晦涩的Unicode字符,以及其他所有内容。
如果您正在谈论撰写Symbol
文字的各种方法,请以下是我最好的理解:
:
字面值:任何有效的Ruby标识符(例如:foo
,:Foo
,:@foo
,:@@foo
,:$foo
,{{1 },...):$:
字面值:在单引号:
字面值中有效的所有内容,包括转义序列,例如String
和:'\''
:'\\'
字面值:在双引号:
字面值中有效的所有内容,包括转义序列,例如String
,:"\""
和{{1} },以及字符串插值,它允许您将任意Ruby代码的结果注入:"\\"
,例如:"\n"
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
文字,包括转义序列和插值,例如{"foo\n#{bar}": 42}
当然有许多其他表达式评估为Symbol
s:
def foo;end # => :foo
String#to_sym
(别名String#intern
):'foo bar'.to_sym # => :'foo bar'
return
Symbol
答案 1 :(得分:2)
http://www.cse.buffalo.edu/~regan/cse305/RubyBNF.pdf枚举定义Ruby语法的无上下文语法产生。 CFG本质上比RE更强大,所以你可能想为这个工作考虑一个不同的工具 - 但是你当然可以查看这个文档并尝试构建一个匹配所有情况的正则表达式。