我需要一個問題的幫助。我有一個包含一些ruby代碼的列表,如下所示:self.org_premium = self.volume/12 * 0.1492 self.billing_premium = self.subscriber_premium + self.org_premium
或employment_level == 'P'
或vol_life.save
。 現在我想在這些字符串中找到方法,但必須忽略一些Rails方法,如save
或nil?
。 我用開膛手,但他的方法slice
只返回1參數。 也許你對此有一些想法?解析紅寶石代碼
解析紅寶石代碼
回答
當您使用Ripper切片,例如:
$ irb
2.0.0p247 :001 > p Ripper.slice('def m(a) nil end', 'ident')
要看到什麼事件是可用的,只是評價它指的是在文檔中的常數:事件被進一步細分爲PARSER_EVENTS和SCANNER_EVENTS。
$ irb
2.0.0p247 :001 > require 'ripper'
2.0.0p247 :002 > Ripper::EVENTS
=> [:BEGIN, :END, :alias, :alias_error, :aref, :aref_field, :arg_ambiguous, :arg_paren, :args_add, :args_add_block, :args_add_star, :args_new, :array, :assign, :assign_error, :assoc_new, :assoc_splat, :assoclist_from_args, :bare_assoc_hash, :begin, :binary, :block_var, :block_var_add_block, :block_var_add_star, :blockarg, :bodystmt, :brace_block, :break, :call, :case, :class, :class_name_error, :command, :command_call, :const_path_field, :const_path_ref, :const_ref, :def, :defined, :defs, :do_block, :dot2, :dot3, :dyna_symbol, :else, :elsif, :ensure, :excessed_comma, :fcall, :field, :for, :hash, :if, :if_mod, :ifop, :lambda, :magic_comment, :massign, :method_add_arg, :method_add_block, :mlhs_add, :mlhs_add_star, :mlhs_new, :mlhs_paren, :module, :mrhs_add, :mrhs_add_star, :mrhs_new, :mrhs_new_from_args, :next, :opassign, :operator_ambiguous, :param_error, :params, :paren, :parse_error, :program, :qsymbols_add, :qsymbols_new, :qwords_add, :qwords_new, :redo, :regexp_add, :regexp_literal, :regexp_new, :rescue, :rescue_mod, :rest_param, :retry, :return, :return0, :sclass, :stmts_add, :stmts_new, :string_add, :string_concat, :string_content, :string_dvar, :string_embexpr, :string_literal, :super, :symbol, :symbol_literal, :symbols_add, :symbols_new, :top_const_field, :top_const_ref, :unary, :undef, :unless, :unless_mod, :until, :until_mod, :var_alias, :var_field, :var_ref, :vcall, :void_stmt, :when, :while, :while_mod, :word_add, :word_new, :words_add, :words_new, :xstring_add, :xstring_literal, :xstring_new, :yield, :yield0, :zsuper, :CHAR, :__end__, :backref, :backtick, :comma, :comment, :const, :cvar, :embdoc, :embdoc_beg, :embdoc_end, :embexpr_beg, :embexpr_end, :embvar, :float, :gvar, :heredoc_beg, :heredoc_end, :ident, :ignored_nl, :int, :ivar, :kw, :label, :lbrace, :lbracket, :lparen, :nl, :op, :period, :qsymbols_beg, :qwords_beg, :rbrace, :rbracket, :regexp_beg, :regexp_end, :rparen, :semicolon, :sp, :symbeg, :symbols_beg, :tlambda, :tlambeg, :tstring_beg, :tstring_content, :tstring_end, :words_beg, :words_sep]
2.0.0p247 :009 > Ripper::PARSER_EVENTS
=> [:BEGIN, :END, :alias, :alias_error, :aref, :aref_field, :arg_ambiguous, :arg_paren, :args_add, :args_add_block, :args_add_star, :args_new, :array, :assign, :assign_error, :assoc_new, :assoc_splat, :assoclist_from_args, :bare_assoc_hash, :begin, :binary, :block_var, :block_var_add_block, :block_var_add_star, :blockarg, :bodystmt, :brace_block, :break, :call, :case, :class, :class_name_error, :command, :command_call, :const_path_field, :const_path_ref, :const_ref, :def, :defined, :defs, :do_block, :dot2, :dot3, :dyna_symbol, :else, :elsif, :ensure, :excessed_comma, :fcall, :field, :for, :hash, :if, :if_mod, :ifop, :lambda, :magic_comment, :massign, :method_add_arg, :method_add_block, :mlhs_add, :mlhs_add_star, :mlhs_new, :mlhs_paren, :module, :mrhs_add, :mrhs_add_star, :mrhs_new, :mrhs_new_from_args, :next, :opassign, :operator_ambiguous, :param_error, :params, :paren, :parse_error, :program, :qsymbols_add, :qsymbols_new, :qwords_add, :qwords_new, :redo, :regexp_add, :regexp_literal, :regexp_new, :rescue, :rescue_mod, :rest_param, :retry, :return, :return0, :sclass, :stmts_add, :stmts_new, :string_add, :string_concat, :string_content, :string_dvar, :string_embexpr, :string_literal, :super, :symbol, :symbol_literal, :symbols_add, :symbols_new, :top_const_field, :top_const_ref, :unary, :undef, :unless, :unless_mod, :until, :until_mod, :var_alias, :var_field, :var_ref, :vcall, :void_stmt, :when, :while, :while_mod, :word_add, :word_new, :words_add, :words_new, :xstring_add, :xstring_literal, :xstring_new, :yield, :yield0, :zsuper]
2.0.0p247 :010 > Ripper::SCANNER_EVENTS
=> [:CHAR, :__end__, :backref, :backtick, :comma, :comment, :const, :cvar, :embdoc, :embdoc_beg, :embdoc_end, :embexpr_beg, :embexpr_end, :embvar, :float, :gvar, :heredoc_beg, :heredoc_end, :ident, :ignored_nl, :int, :ivar, :kw, :label, :lbrace, :lbracket, :lparen, :nl, :op, :period, :qsymbols_beg, :qwords_beg, :rbrace, :rbracket, :regexp_beg, :regexp_end, :rparen, :semicolon, :sp, :symbeg, :symbols_beg, :tlambda, :tlambeg, :tstring_beg, :tstring_content, :tstring_end, :words_beg, :words_sep]
的「IDENT」是在這種情況下,方法名定義一個事件,該事件是不是真的等同於一個稱爲代碼的方法。
我不確定Ripper是解析所用方法名稱的最簡單方法。另外,Ruby處理由method_missing
處理的調用的能力確實很難看出可以解釋的內容。
就像我在評論中說的,還有其他幾種方法可以解析你可能會看到的方法。
你甚至可以用字符串操作/檢查可用的方法來做類似的事情,例如,
class A
IGNORE = %w{save nil?}
def find_possible_methods(s)
s.split(/[\-\ ,\.\(\)\{\}\[\]]/).reject{|c| c =~ /[0-9\*\-\/\+\%\=\~].*/ || c.empty? || IGNORE.include?(c)}
end
def find_implemented_methods(s)
(s.split(/[\-\ ,\.\(\)\{\}\[\]]/) & (methods + private_methods).collect(&:to_s)).reject{|c| IGNORE.include?(c)}
end
end
用法:
a = A.new
=> #<A:0x007facb9a94be8>
a.find_possible_methods 'self.org_premium = self.volume/12 * 0.1492 self.billing_premium = self.subscriber_premium + self.org_premium'
=> ["self", "org_premium", "self", "volume", "self", "billing_premium", "self", "subscriber_premium", "self", "org_premium"]
謝謝,但這種解決方案並沒有幫助我。我需要像這樣的解決方案:https://github.com/michaeledgar/object_regex。原始方法從開始搜索到一個匹配,但我想查找所有匹配。作者希望僅提取評論,並且此gem不適用於方法。也許你知道這是怎麼回事? – Nike0
請在問題中澄清你到底在找什麼。可以看看下面的內容,但都不是最新的:[ruby_parser](https://github.com/seattlerb/ruby_parser),[SExp_Path](https://github.com/AdamSanderson/SExp_Path/) ),[這篇文章](http://programmingisterrible.com/post/42432568185/how-to-parse-ruby),[ripper](http://www.ruby-doc.org/stdlib-2.0.0/ libdoc/ripper/rdoc/Ripper.html),[ripper-plus](https://github.com/michaeledgar/ripper-plus),[laser](https://github.com/michaeledgar/laser) –
也有些方法可以確定在運行時執行的方法,如:[TracePoint](http://www.ruby-doc.org/core-2.0.0/TracePoint.html)和[set_trace_func](http:// apidock.com/ruby/Kernel/set_trace_func)。和[tracer](http://www.ruby-doc.org/stdlib-2.0.0/libdoc/tracer/rdoc/Tracer.html),如果你想看到代碼行被執行。但是,我不認爲你在尋找那個? –
- 1. 解析紅寶石
- 2. 解析紅寶石
- 3. 紅寶石Nokogiri Javascript解析
- 4. 簡單解析紅寶石
- 5. JS解析紅寶石
- 6. 解析在紅寶石
- 7. 時間解析紅寶石
- 8. 解析文件紅寶石
- 9. 紅寶石XML解析
- 10. 解析像紅寶石
- 11. 紅寶石解析錯誤
- 12. 解析JSON紅寶石
- 13. 解析的dmidecode紅寶石
- 14. 紅寶石浮子解析
- 15. 框架紅寶石解析/靜態代碼分析
- 16. 紅寶石nokogiri解析解析
- 17. 解釋紅寶石代碼片段
- 18. 無法理解紅寶石代碼
- 19. 瞭解紅寶石代碼行
- 20. 逃逸紅寶石代碼
- 21. 紅寶石錯誤代碼
- 22. 紅寶石 - 如何運行Windows cmd上的紅寶石代碼
- 23. 紅寶石代碼理解 - 來自代碼學校
- 24. 紅寶石:解析CSV數據到PDF
- 25. 解析日期/時間紅寶石
- 26. 使用紅寶石解析LESS
- 27. 紅寶石:解析複雜的哈希
- 28. 紅寶石:XML到JSON樹解析
- 29. 紅寶石:解析API響應
- 30. 紅寶石 - FasterCSV後解析JSON
有點相關的問題:http://stackoverflow.com/questions/6379703/is-there-something-similar-to-nokogiri-for-parsing-ruby-代碼 –