Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 检测字符串中的错误语法_Ruby_String_Parsing_Syntax - Fatal编程技术网

Ruby 检测字符串中的错误语法

Ruby 检测字符串中的错误语法,ruby,string,parsing,syntax,Ruby,String,Parsing,Syntax,我第一次参加了那些面试编码测验,我正处于一个介于沉溺于dran-o浴缸和投资无泪泡泡浴产品以及一堆烤面包机之间的阶段 问题如下: 如果给您一个字符串,如“zx(c)abcde[z{x]}”,则编写一个函数,如果语法正确,则返回true;如果语法不正确,则返回false:例如,在该字符串中,括号和大括号被弄乱了。换句话说,“{hello}mot[o]”将通过,但“{hello}mo{[t}”将不会通过 我的整个过程是这样的:保留一个开始和结束括号/括号/括号位置的列表,然后看看是否有重叠。但这不是

我第一次参加了那些面试编码测验,我正处于一个介于沉溺于dran-o浴缸和投资无泪泡泡浴产品以及一堆烤面包机之间的阶段

问题如下:

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

我的整个过程是这样的:保留一个开始和结束括号/括号/括号位置的列表,然后看看是否有重叠。但这不是一个最佳的解决方案,所以我把它炸了

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


提前谢谢。

我会用一个XML标记替换每个括号,然后通过XML验证程序运行它。它会找出像这样奇怪的东西:

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

这将导致XML验证失败,因此您可以直接返回该结果。

[编辑:我已经合并了@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
MATCH={'['=>']'、'('=>')'、'{'=>'}
打开=匹配.keys
关闭=匹配.values
def检查是否匹配(str)
str.chars.每个带有_对象([])do | c,arr的|
案例c
什么时候开始
arr false
检查是否匹配(“zx(c)abcde[z{x}]”)\

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

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


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

您是如何跟踪它们的位置的?这可以归结为如何计算中缀表达式。只需将开括号推到堆栈中,当遇到闭括号时弹出,最后检查堆栈是否正确empty@no疯狂,你能解释一下吗?我的脑海里有这样的想法,但我完全僵住了,觉得我有一个动脉瘤XML验证器对于这个问题来说绝对是大材小用,而且对于这样一个简单的问题来说是一个巨大的依赖性。好吧,公平地说,这是一个面试考试,这会让人大吃一惊。:)我意识到g XML validator是一个非常大的滥杀滥伤,但归根结底,它需要可靠、快速地工作,并且没有疯狂的调试。我无法想象一个正则表达式调试起来会更容易…运行XML验证器比调试正则表达式IMO更容易。老实说,我个人会使用正则表达式解决方案:)但是XML验证器有更多的方法测试支持比其他方法更好,因为W3C不会让类似的东西溜走,而且它有巨大的可信度。@meagar,我认为我们同时做了相同的编辑,但感谢!
case c;when*OPENING;…;when*CLOSING;…
会更好。如果(arr.empty?或(c!=MATCH[arr.last]),您还可以简化
返回false;arr.pop
to
返回false,除非c==MATCH[arr.pop]
。它不应该是
c=MATCH[arr.pop]
而是
c==MATCH[arr.pop]
。你能解释一下*在打开和关闭之前做了什么吗?以前从未见过。
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