Чтобы определить, содержит ли строка одной или нескольких строк вида «xooy», где «х» и «у» являются любые другие, чем «о» символов, но не содержит строки «ХОУ» и или "ооо" (и расширением, нет "OOOO" и т.д.), вы можете сделать следующее:
def double_os_only?(str)
str.scan(/o+/).map(&:size).minmax == [2,2]
end
strings = ['fo','foo','fooo', 'oofo', 'oofoo', 'oofooo', 'photo', 'potatoo', "dang"]
strings.map { |s| puts "#{ s } => #{ double_os_only?(s) }" }
fo => false
foo => true
fooo => false
oofo => false
oofoo => true
oofooo => false
photo => false
potatoo => false
dang => false
Обратите внимание, что, если str.scan(/o+/) #=> []
, [].map(&:size) #=> []
и [].minmax #=> [nil,nil]
.
Другой способ заключается в изменении регулярное выражение, данное @Avinash:
R =/
^ # match beginning of the line
(?: # begin a non-capture group
[^o]* # match zero or more characters other than 'o'
oo # match 'oo'
[^o]* # match zero or more characters other than 'o'
(?!o) # do not match 'o' in a negative lookahead
)+ # end the non-capture group and perform >= 1 times
$ # match end of line
/x # extended/free-spacing regex definition
def double_os_only?(str)
!!(str =~ R)
end
!
преобразует truthy значение false
и falsy значение true
. !!
поэтому преобразует истинное значение в true
и значение фальши в false
.
Вы ошибаетесь. '' foo "' включает в себя не только '' oo "', но также '' f "', '" fo "', '" foo "'. – sawa