Ruby - 在括号内查找字符

时间:2017-03-21 11:37:56

标签: ruby-on-rails ruby

我在Ruby中有一个字符串。我需要遍历字符串中的括号。

我的字符串:

(((MILK AND SOYA) OR NUT) AND COCONUT)

首先迭代应该返回:

((MILK AND SOYA) OR NUT) AND COCONUT

第二次迭代应返回以下内容:

(MILK AND SOYA) OR NUT

第三次迭代应返回以下文本:

MILK AND SOYA

如何在Ruby中执行此操作?在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

你的解决方案:

/\((.*)\)/

正则表达式width: 100%; height: auto;搜索括号内的字符串

答案 1 :(得分:3)

gsub和regex

@ 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 "

树的布尔逻辑

使用解析器gem

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方法。您可以递归调用以获取有关表达式的任何信息。

使用sexp gem

(感谢@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

我希望它有所帮助