将类似Lisp的字符串转换为Ruby数组

时间:2013-08-07 15:13:39

标签: ruby regex parsing

我有一个这样的字符串:

s = '+((((content:suspension) (content:sensor))~2) ((+(((content:susp) (content:sensor))~2)) (+(((content:height) (content:control) (content:sensor))~3)) (+(((content:height) (content:sensor))~2)) (+(((content:level) (content:control) (content:sensor))~3)) (+(((content:rear) (content:height) (content:sensor))~3)) (+(((content:ride) (content:height) (content:sensor))~3))))'

我想将它转换成一个字符串数组,如下所示:

["suspension sensor", "susp sensor", "height control sensor", "height sensor", "level control sensor", "rear height sensor", "ride height sensor"]

这是一个非常丑陋的代码,可以实现:

a = s.gsub('content:', '') \
  .gsub(/\+/, '') \
  .gsub(/~\d/, '') \
  .gsub(/\((\w+)\)/) { $1 } \
  .gsub(/\(([^\(]*[^\)])\)/) { "#{$1}" } \
  .gsub(/[\(\)]/,', ') \
  .split(/\s?,\s?/) \
  .reject {|x| x.strip == ''}

我认为必须有一个更好的方法来实现这一点,因为如果你取出content:前缀以及+~\d件,那么它就像一个Lisp表达

1 个答案:

答案 0 :(得分:0)

s.gsub(/\(content:([^(]*)\)/, '\1').scan(/(?<=\()[^()]*(?=\))/)

# => ["suspension sensor", "susp sensor", "height control sensor", "height sensor", "level control sensor", "rear height sensor", "ride height sensor"]