Следующий метод сделает работу
def substring_between(target, match1, match2)
start_match1 = target.index(match1)
if start_match1 && start_match2 = target.index(match2, start_match1 + match1.length)
start_idx = start_match1 + match1.length
target[start_idx, start_match2 - start_idx]
else
nil
end
end
Если вы хотите создать это как метод экземпляра в строковом классе, тогда это должно работать для вас
class String
def substring_between(sub1, sub2)
match1 = self.index(sub1)
if match1 && match2 = self.index(sub2, match1 + sub1.length)
idx = match1 + sub1.length
self[idx, match2 - idx]
else
nil
end
end
end
Обе реализации возвращают nil, если начальный или конечный теги не существуют или находятся в неправильном порядке. Следующий тестовый скрипт и результаты показывают, что он работает
strings = [
'No tags at all',
'<font End tag before start tag <p>',
'<p>End tag at end <font',
'No start tag <font',
'<p>No end tag',
'<p>aaa <font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p>',
' <p>bbb <font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p>',
'<p>ccc cccc<font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p>'
]
strings.each do |s|
puts "Method Test = #{s} Result: |#{substring_between(s, '<p>', '<font')}|"
puts "String Test = #{s} Result: |#{s.substring_between('<p>', '<font')}|"
end
Method Test = No tags at all Result: ||
String Test = No tags at all Result: ||
Method Test = <font End tag before start tag <p> Result: ||
String Test = <font End tag before start tag <p> Result: ||
Method Test = <p>End tag at end <font Result: |End tag at end |
String Test = <p>End tag at end <font Result: |End tag at end |
Method Test = No start tag <font Result: ||
String Test = No start tag <font Result: ||
Method Test = <p>No end tag Result: ||
String Test = <p>No end tag Result: ||
Method Test = <p>aaa <font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p> Result: |aaa |
String Test = <p>aaa <font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p> Result: |aaa |
Method Test = <p>bbb <font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p> Result: |bbb |
String Test = <p>bbb <font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p> Result: |bbb |
Method Test = <p>ccc cccc<font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p> Result: |ccc cccc|
String Test = <p>ccc cccc<font style="color:red">ABCD@@@EFG^&*))*T*^[][][]</p> Result: |ccc cccc|