假设
str = "???!!!???!"
如果我们首先删除两组"???"
我们留下"!!!!"
,不能被进一步减小。
如果我们第一次删除组"!!!"
我们剩下"??????!"
,这是不能进一步减少。
如果我们被允许移除任何一个字符的所有奇怪群体,而没有提到另一个字符的效果,我们获得!
,这不能进一步减少。
目前还不清楚使用什么规则。这里有三个可能性和代码来实现每个。
我将使用以下两个正则表达式,并在前两种情况下使用一个辅助方法。
Rq =/
(?<!\?) # do not match a question mark, negative lookbehind
\? # match a question mark
(\?{2})+ # match two question marks one or more times
(?!\?) # do not match a question mark, negative lookahead
/x # free-spacing regex definition mode
它通常写成。
同样,
Rx = /(?<!!)!(!{2})+(?!!)/
def sequential(str, first_regex, second_regex)
s = str.dup
loop do
size = s.size
s = s.gsub(first_regex,'').gsub(second_regex,'')
return s if s.size == size
end
end
予应用的每个的三种方法的以下两个示例字符串:
str1 = "???!!!???!"
str2 = 50.times.map { ['?', '!'].sample }.join
#=> "?!!!?!!!?!??????!!!?!!??!!???!?!????!?!!!?!?!???!?"
替换"?"
的"!"
然后奇数群组的所有奇数组然后重复直到没有进一步的清除是可能的
def question_before_exclamation(str)
sequential(str, Rq, Rx)
end
question_before_exclamation str1 #=> "!!!!"
question_before_exclamation str2 #=> "??!??!?!!?!?!!?"
更换"!"
的"?"
然后奇组的所有奇数组,然后重复,直到没有进一步的清除有可能
def exclamation_before_question(str)
sequential(str, Rx, Rq)
end
exclamation_before_question str1 #=> "??????!"
exclamation_before_question str2 #=> "??!????!!?!?!!?!?!!?"
更换两个"?"
和"!"
的所有奇数组再重复,直到没有进一步的清除有可能
Rqx = /#{Rq}|#{Rx}/
#=> /(?-mix:(?<!\?)\?(\?{2})+(?!\?))|(?-mix:(?<!!)!(!{2})+(?!!))/
def question_and_explanation(str)
s = str.dup
loop do
size = s.size
s = s.gsub(Rqx,'')
return s if s.size == size
end
end
question_and_explanation str1 #=> "!"
question_and_explanation str2 #=> "??!?!!?!?!!?!?!!?"
你对你的问题有足够的重视,欣赏给定的时间。 –