str = 'aaaaaaaaa ODS | Filename = /tmp/bbbbbb | NAME = ccccc'
marker1 = 'ODS | FILENAME = /tmp/'
marker2 = ' | NAME'
r = /(?<=#{Regexp.escape(marker1)}).*(?=#{Regexp.escape(marker2)})/i
#=> /(?<=ODS\ \|\ FILENAME\ =\ \/tmp\/).*(?=\ \|\ NAME)/i
str[r]
#=> "bbbbbb"
или
r = /#{Regexp.escape(marker1)}(.*)#{Regexp.escape(marker2)}/i
str[r,1]
#=> "bbbbbb"
или, если известно, что сопоставляемая строка записана в нижнем регистре, или допустимо вернуть строку в нижнем регистре:
s = str.downcase
#=> "aaaaaaaaa ods | filename = /tmp/bbbbbb | name = ccccc"
m1 = marker1.downcase
#=> "ods | filename = /tmp/"
m2 = marker2.downcase
#=> " | name"
id1 = s.index(m1) + m1.size
#=> 32
id2 = s.index(m2, id1+1) - 1
#=> 37
str[id1..id2]
#=> "bbbbbb"
См. Regexp :: escape . В № 1
(?<=#{Regexp.escape(marker1)})
- это позитивный взгляд за , требующий, чтобы marker1
появился непосредственно перед матчем.
(?=#{Regexp.escape(marker2)})
- это позитивный прогноз , требующий marker2
для немедленного отслеживания матча.
В # 3 я использовал форму String # index , которая принимает второй аргумент ("смещение").