【问题标题】:Finding parenthesis via regular expression通过正则表达式查找括号
【发布时间】:2013-11-27 04:09:01
【问题描述】:

我不擅长正则表达式。我正在寻找一个字符串是否包含“(),[],{}”。注意,我不是在实际的()中查找内容,只是看字符串中是否包含()或{}、[]。

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

【问题讨论】:

  • 您是否要验证匹配的括号?即,这是不是:)( 是否匹配?
  • 验证匹配的括号。我终于弄明白了。谢谢!

标签: ruby regex brackets


【解决方案1】:

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

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

如果没有这些问号,模式.* 将是“贪婪的”,例如扫描“abc(def)ehi(jkl)mno”会发现只有一个匹配“(def)ehi(jkl)”(@ 987654323@ 会将所有内容都吞噬到最后一个右括号),但是使用非贪婪的.*? 你会得到两个匹配的“(def)”和“(jkl)”。

【讨论】:

  • 谢谢波西米亚人。我不知道什么是贪婪/非贪婪,所以谢谢你的澄清。
【解决方案2】:

如果您想检查匹配的括号/方括号/大括号,这将起作用:

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

更多信息请参见here

这会返回字符串的匹配部分:

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

【讨论】:

  • 谢谢!我现在刚刚使用了那个表达方式,效果很好。再次感谢。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2015-08-26
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多