import Foundation
let pattern = #"<hr\s*\/>\s*[\\n]*\s*(.+<\/p>)"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"""
<hr />\n\n<h3 class="brown art">Базовая комплектация обычно включает в себя (включая сборку и доставку):</h3>\n<ul>\n <li><em>Сруб из строганного бревна, средний диаметр 25 см. (вершинка).</em></li>\n <li><em>Высота потолков 1 этажа 2.7 м., 2 этажа 2.5-2.7 м.</em></li>\n <li><em>Перегородки по проекту рубленные из такого же бревна, 1 этаж.</em></li>\n <li><em>Тип рубки чаша или лапа (любой).</em></li>\n <li><em>Потолочные и половые балки — лафет 0.15 м.</em></li>\n <li><em>Стропильная система – брус 50x200 мм., через 60 см.</em></li>\n <li><em>Фронтоны крыши зашиваются по каркасу вагонкой.</em></li>\n <li><em>Обрешетка крыши – доска обрезная 25x150 мм.</em></li>\n <li><em>Покрытие крыши рубероидом.</em></li>\n <li><em>Все расходные материалы (лен, скобяные изделия, гидроизоляция фундамента, рубероид).</em></li>\n <li><em>Доставка по Московской области, и др. регионам центральной части РФ (Ярославская, Рязанская, Нижегородская, Тверская, Калужская, Тульская, Владимирская, Ивановская обл. и др. регионы РФ).</em></li>\n <li><em>Разгрузочные работы и сборка на участке заказчика.</em></li>\n</ul>\n<p class="black art">Стоимость базового комплекта сруба под крышу с доставкой, разгрузкой и сборкой:</p>
<hr />\n\n<h3 class="brown art">Базовая комплектация обычно включает в себя (включая сборку и доставку):</h3>\n<ul>\n <li><em>Сруб из строганного бревна, средний диаметр 25 см. (вершинка).</em></li>\n <li><em>Высота потолков 1 этажа 2.7 м., 2 этажа 2.5-2.7 м.</em></li>\n <li><em>Перегородки по проекту рубленные из такого же бревна, 1 этаж.</em></li>\n <li><em>Тип рубки чаша или лапа (любой).</em></li>\n <li><em>Потолочные и половые балки — лафет 0.15 м.</em></li>\n <li><em>Стропильная система – брус 50x200 мм., через 60 см.</em></li>\n <li><em>Фронтоны крыши зашиваются по каркасу вагонкой.</em></li>\n <li><em>Обрешетка крыши – доска обрезная 25x150 мм.</em></li>\n <li><em>Покрытие крыши рубероидом.</em></li>\n <li><em>Все расходные материалы (лен, скобяные изделия, гидроизоляция фундамента, рубероид).</em></li>\n <li><em>Доставка по Московской области, и др. регионам центральной части РФ (Ярославская, Рязанская, Нижегородская, Тверская, Калужская, Тульская, Владимирская, Ивановская обл. и др. регионы РФ).</em></li>\n <li><em>Разгрузочные работы и сборка на участке заказчика.</em></li>\n</ul>\n<p class="black art">Стоимость базового комплекта сруба под крышу с доставкой, разгрузкой и сборкой:</p>
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression