我在Ruby中有一个字符串。我需要遍历字符串中的括号。
我的字符串:
(((MILK AND SOYA) OR NUT) AND COCONUT)
首先迭代应该返回:
((MILK AND SOYA) OR NUT) AND COCONUT
第二次迭代应返回以下内容:
(MILK AND SOYA) OR NUT
第三次迭代应返回以下文本:
MILK AND SOYA
如何在Ruby中执行此操作?在此先感谢您的帮助。
答案 0 :(得分:4)
你的解决方案:
/\((.*)\)/
正则表达式width: 100%; height: auto;
搜索括号内的字符串
答案 1 :(得分:3)
@ DmitryCat的解决方案适用于您的示例,但您似乎可能首先对最里面的括号感兴趣。
因此,您需要确保括号内的字符不是括号:
str = "(((MILK AND SOYA) OR NUT) AND COCONUT)"
while str.gsub!(/\(([^\(\)]+)\)/){ p $1; ''}
end
# "MILK AND SOYA"
# " OR NUT"
# " AND COCONUT"
使用"((MILK AND SOYA) OR (MILK AND NUT))"
输出:
# "MILK AND SOYA"
# "MILK AND NUT"
# " OR "
Regexen可能不适合这项工作。
此parser
gem分析您的表达式没有问题:
require 'parser/current'
str = "(((MILK AND SOYA) OR NUT) AND COCONUT)"
p Parser::CurrentRuby.parse(str.gsub(/\b(and|or)\b/i){|s| s.downcase})
# s(:begin,
# s(:and,
# s(:begin,
# s(:or,
# s(:begin,
# s(:and,
# s(:const, nil, :MILK),
# s(:const, nil, :SOYA))),
# s(:const, nil, :NUT))),
# s(:const, nil, :COCONUT)))
您现在有了一个树:一个根节点和children
方法。您可以递归调用以获取有关表达式的任何信息。
(感谢@Casper提出此建议)
看起来sexp
gem也可能有用,可能使用比parser
更简单的语法:
require 'sxp'
p SXP.read("(((MILK AND SOYA) OR (NUT AND SOYA)) AND COCONUT)")
# [[[:MILK, :AND, :SOYA], :OR, [:NUT, :AND, :SOYA]], :AND, :COCONUT]
正如@Casper在评论中提到的那样(再次感谢!),你正试图重新发明轮子。如果您需要使用布尔表达式搜索Rails的全文,Sphinx是一个很棒的工具。它快速,良好,可靠,并且有适用于Ruby / Rails的适配器:thinkingsphinx。
答案 2 :(得分:0)
使用index获取第一个字符'('和rindex以查找结束字符')':
s = "(((MILK AND SOYA) OR NUT) AND COCONUT)"
s = s.slice(s.index('(') + 1, s.rindex(')') - 1) unless s.index('(').nil? || s.rindex(')').nil?
使用此代码,您将获得所需的所有字符串。只需在循环中调用它,直到s为nil
我希望它有所帮助