检测字符串中的错误语法

时间:2014-06-06 19:37:33

标签: ruby string parsing syntax

我刚刚第一次接受了这些采访编码测验,而且我介入的是将自己淹没在一个dran-o和投资No Tears泡泡浴产品以及一堆烤面包机之间。

问题如下:

如果给你一个像"zx(c)abcde[z{x]}"的字符串,写一个函数,如果语法正确则返回true,如果语法不正确则返回false:例如,在该字符串中,括号和大括号混乱。换句话说,"{hello}mot[o]"会通过但"{hello}mo{[t}"不会通过。

我的整个过程如下:保持开始和结束括号/括号/ parens位置列表,然后查看是否有重叠。但那不是最佳解决方案,所以我对它进行了轰炸。

我想了解如何解决这个问题。

提前致谢。

3 个答案:

答案 0 :(得分:5)

[编辑:我已经纳入了@ sawa的优秀建议。]

你能做到这一点的一种方法是使用堆栈。

MATCH   = { '['=>']', '('=>')', '{'=>'}' }
OPENING = MATCH.keys
CLOSING = MATCH.values

def check_for_match(str)
  str.chars.each_with_object([]) do |c, arr|
    case c
    when *OPENING
      arr << c
    when *CLOSING
      return false unless c.eql?(MATCH[arr.pop])
    end
  end.empty?
end

check_for_match("zx(c)abcde[z{x]}") #=> false
check_for_match("zx(c)abcde[z{x}]") #=> true

答案 1 :(得分:2)

<编辑:我认为这个问题似乎很熟悉。我和其他几个人刚才回答了。]

另一种方法是首先删除不相关的字符,然后依次删除相邻的匹配对,直到字符串为空(返回true)或字符串不为空且没有更多匹配的相邻字符串对(返回false)。

def check_for_match(str)
  str = str.gsub(/[^\(\)\[\]\{\}]/, '')
  while str.gsub!(/\(\)|\[\]|\{\}/, ''); end
  str.empty?
end

check_for_match("zx(c)abcde[z{x]}") #=> false
check_for_match("zx(c)abcde[z{x}]") #=> true

读者质询:提供返回false时语法不正确的证明。

答案 2 :(得分:1)

我会用XML标记替换每个括号,然后通过XML验证器运行它。它会选择这样奇怪的东西:

<bracket>stuff<curly>morestuff</bracket></curly>

这将使XML验证失败,因此您可以将其返回。