Ruby String与正则表达式分开

这是Ruby 1.8.7但应该与1.9.x相同

我试图拆分一个字符串,例如:

a = "foo.bar.size.split('.').last" # trying to split into ["foo", "bar","split('.')","last"] 

基本上在它代表的命令中拆分它,我试图用Regexp做但不确定如何,想法是使用regexp

 a.split(/[az\(\)](\.)[az\(\)]/) 

这里尝试使用group (\.)来拆分它,但这似乎不是一个好方法。

我想这会做到:

 a.split(/\.(?=[\w])/) 

我不知道你对正则表达式了解多少,但是(?=[\w])是一个前瞻,说“如果下一个字符是一个字母的字符,则只匹配点”。 预测实际上不会抓取它匹配的文本。 它只是“看起来”。 所以结果正是你想要的:

 > a.split(/\.(?=[\w])/) => ["foo", "bar", "size", "split('.')", "last"] 

我担心正则表达式不会带你走得太远。 考虑以下表达式(也是有效的Ruby)

 "(foo.bar.size.split( '.' )).last" "(foo.bar.size.split '.').last" "(foo.bar.size.split '( . ) . .(). .').last" 

问题是,调用列表实际上是一个调用树。 最简单的解决方案可能是使用Ruby解析器并根据您的需要转换解析树(在此示例中,我们递归地下降到调用树中,将调用收集到列表中):

 # gem install ruby_parser # gem install awesome_print require 'ruby_parser' require 'ap' def calls_as_list code tree = RubyParser.new.parse(code) t = tree calls = [] while t # gather arguments if present args = nil if t[3][0] == :arglist args = t[3][1..-1].to_a end # append all information to our list calls << [t[2].to_s, args] # descend to next call t = t[1] end calls.reverse end p calls_as_list "foo.bar.size.split('.').last" #=> [["foo", []], ["bar", []], ["size", []], ["split", [[:str, "."]]], ["last", []]] p calls_as_list "puts 3, 4" #=> [["puts", [[:lit, 3], [:lit, 4]]]] 

并显示任何输入的解析树:

 ap RubyParser.new.parse("puts 3, 4") 
 a = "foo.bar.size.split('.').last" p a.split(/(? ["foo", "bar", "size", "split('.')", "last"] 

您正在寻找Lookahead和Lookbehind断言。 http://www.regular-expressions.info/lookaround.html

在这里,我没有ruby环境。 我尝试使用python re.split()。

 In : re.split("(? 

上面的正则表达式具有负前瞻和后观,以确保只有单引号之间的“点”不能作为分隔符。

当然,对于你给出的例子,一个lookbehind或lookahead就足够了。 您可以根据自己的要求选择合适的方式。