将类似Lisp的字符串转换为Ruby数组
我有这样一个字符串:将类似Lisp的字符串转换为Ruby数组,ruby,regex,parsing,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) (con
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 == ''}
我认为一定有更好的方法来实现这一点,如果你去掉内容:
前缀和+
和~\d
片段,那么它就像一个Lisp表达式。s.gsub(/\(内容:([^(]*)\)/,'\1')。扫描(/(?[“悬架传感器”,“悬架传感器”,“高度控制传感器”,“高度传感器”,“高度控制传感器”、“后高度传感器”、“行驶高度传感器”]
s.gsub(/\(content:([^(]*)\)/, '\1').scan(/(?<=\()[^()]*(?=\))/)
# => ["suspension sensor", "susp sensor", "height control sensor", "height sensor", "level control sensor", "rear height sensor", "ride height sensor"]
有趣的格式。~n
指示符似乎是多余的(因为括号已经确定了分组的数量)?或者它们是否增加了任何进一步的意义?并且您似乎想忽略上面的任何其他结构?可以解析正常编写的S表达式(sexps)进入数组。@mbrach~2是一个“增强”。@RoryO'Kane我也会看一看Sexpistol,不过我认为我只需要一个简单的正则表达式。这看起来很完美。我只是想用scan找到一些东西,但这一点很关键:([^(]*)。再次感谢。