通过正则表达式查找括号

时间:2013-11-27 04:09:02

标签: ruby regex brackets

我对正则表达式不太满意。我希望找到一个字符串是否包含“(),[],{}”。注意,我不是在查找actual()中的内容,只是为了查看字符串是否包含()或{},[]。

我知道如果我做.scan,它会接受任何匹配并创建一个数组(我想要的)。我只是不知道表达方式。

3 个答案:

答案 0 :(得分:1)

使用非贪婪匹配的替代方案:

/\(.*?\)|\{.*?\}|\[.*?\]/

没有这些问号,模式.*将是"贪婪",例如扫描" abc(def)ehi(jkl)mno"只会找到一个匹配的"(def)ehi(jkl)" (.*会把所有内容吞噬到最后一个关闭括号),但是使用非贪婪的.*?你会获得两场比赛"(def)"和"(jkl)"如你所愿。

答案 1 :(得分:0)

如果你想检查匹配的parens / bracket / braces,这将有效:

/\(.*\)|\{.*\}|\[.*\]/

请参阅here了解更多信息。

然后返回字符串的匹配部分:

>> "alkd(jfla)kjd{adlkfj}alkjfd".scan(/\(.*\)|\{.*\}|\[.*\]/)
=> ["(jfla)", "{adlkfj}"]

答案 2 :(得分:0)

您(在评论中)说要验证匹配的括号。但是,"())("包含两对一对,一个开放的括号和一个封闭的括号,但是它们不匹配。

要确认字符串至少包含一对匹配的括号,花括号或方括号,并且没有不匹配的对,可以使用堆栈。

def check_it(str)
  h = { '(' => ')', '{' => '}', '[' => ']' }
  hi = h.invert 
  at_least_one_pair = false
  stack = []
  str.each_char do |c|
    if h.key?(c)
      stack << c
      at_least_one_pair = true
    elsif hi.key?(c)
      return false unless stack.last == hi[c]
      stack.pop
    end
  end
  stack.empty? && at_least_one_pair
end

check_it "who (is) {that} at the {door}?" #=> true
check_it "who (is{ [that at] the} door)?" #=> true
check_it "who (is) )that( at the door?"   #=> false
check_it "who (is[ )that] at the door?"   #=> false
check_it "who (is that at the door?"      #=> false
check_it "who is that at the door"        #=> false