Ruby 如何通过perens分隔字符串而不丢失perens?红宝石

Ruby 如何通过perens分隔字符串而不丢失perens?红宝石,ruby,regex,string,Ruby,Regex,String,所以我试图解决一个挑战,如果佩伦一家的顺序正确,我会返回true;当然,还有其他错误。我想到的代码如下: def valid_parentheses(str) return false if str.length % 2 == 1 begin eval(str) rescue SyntaxError false else true end end

所以我试图解决一个挑战,如果佩伦一家的顺序正确,我会返回true;当然,还有其他错误。我想到的代码如下:

def valid_parentheses(str)
    return false if str.length % 2 == 1
        begin
            eval(str)
        rescue SyntaxError
            false
        else
            true
        end
    end
end
除了在诸如
有效括号(“hi(hi)()”
之类的情况下,它应该返回
#=>true
,但会返回
false
,因为结尾
()
不需要引号,因此会引发错误

我试着用括号把它分开,但是:

str.split(/\(.*\))
# =>"hi"
因为它删除了所有参数,并且:

str.scan(/\(.*\))
#=> "(hi)()"
因为从技术上讲,它仍然以
开始,以
结束)


如何将其拆分为
“(hi)
“()”

您考虑过使用正则表达式吗? 比如:

/hay/ =~ 'haystack'   #=> 0
/y/.match('haystack') #=> #<MatchData "y">
/hay/=~'haystack'#=>0
/y/.match('haystack')#=>#

可能有用。

你已经接近你想要的了。如果我正确理解您的问题,我会使用以下正则表达式:

(\(.*?\))

\(      // match the left bracket
.*?     // match any character as FEW times as possible (lazy use of * because of the ?)
\)      // match the right bracket

事实上,由于懒惰模式,给定角色的搜索将在最后一个使用的角色之后立即开始

  • X*
    在行尾开始搜索(贪婪
  • X*?
    在上次使用的字符(lazy)之后立即开始搜索
  • X*+
    与贪婪量词相似,只是它不会回溯

@失范者在此解释:

有几种方法可以做到这一点。一种方法是首先删除除
“(“
”)“
以外的所有字符,然后在循环中删除子字符串
”(“
”),直到不能删除更多这样的对为止。如果字符串为空,则平衡排列;否则就不是了

def balanced_parens?(str)
  pstr = str.gsub(/[^()]/,"")
  puts "pstr=#{pstr}"
  while pstr.gsub!("()", "")
  end
  pstr.empty?
end

balanced_parens? "Now (is(the(time)to(have(fun)))fun)"
  #=> true
balanced_parens? "Now (is(the)time)to(have)fun)((fun)"
  #=> false
以下是这两个字符串的分步说明:

str = "Now (is(the(time)to(have(fun)))fun)"
pstr = str.gsub(/[^()]/,"")
  #=> "((()(())))" 
pstr.gsub!("()", "")
  #=> "((()))" 
pstr.gsub!("()", "")
  #=> "(())" 
pstr.gsub!("()", "")
  #=> "()" 
pstr.gsub!("()", "")
  #=> "" 
pstr.gsub!("()", "")
  #=> nil 
pstr.empty?
  #=> true

str = "Now (is(the)time)to(have)fun)((fun)"
pstr = str.gsub(/[^()]/,"")
  #=> "(())())(()" 
pstr.gsub!("()", "")
  #=> "())(" 
pstr.gsub!("()", "")
  #=> ")(" 
pstr.gsub!("()", "")
  #=> nil 
pstr.empty?
  #=> false

实际上,我只是试过了。如果我不考虑其他字符(例如,
/\(\)/.match(str)
),它会给我“()”,但如果我像上面显示的那样,我仍然会得到“(hi)()。谢谢,您能否清楚地解释一下,您希望通过一个或多个示例输入字符串实现什么以及相应的预期结果?如果我理解的很好,你想检查括号是否平衡,是吗?我已经可以说,拆分的方法不是可行的。如果str.length%2==1,为什么这个奇怪的测试
返回false?(请注意,
==1
是无用的,您可以检查最后一位,而不是使用模)