我对正则表达式不太满意。我希望找到一个字符串是否包含“(),[],{}”。注意,我不是在查找actual()中的内容,只是为了查看字符串是否包含()或{},[]。
我知道如果我做.scan,它会接受任何匹配并创建一个数组(我想要的)。我只是不知道表达方式。
答案 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