Извините, это не будет значительным ответом, но, возможно, я могу немного помочь. Теперь для шагов 1, 2 и 3 не составит труда найти соответствие как таковое
вкладка \ t
новые строки \ r или \ n
Пробел (пробел, табуляция или новая строка) равен \ s
т. 1 вкладка: (\ t)
два пробела = (\ s \ s) или (\ s {2})
и дополнительная строка, как правило, находится по двум разрывам строки подряд, но иногда они могут быть разделены пробелами, так что следите за этим ... (\ r \ s * \ r) | (\ n \ s * \ n)
чтобы сложить все вместе, шаги 1/2/3 с группами захвата:
(\r\s*\r)|(\n\s*\n)|(\t)|(\s{2})
Но как насчет 4 и 5?
Что ж, им обоим необходимо иметь возможность возвращаться к регулярному выражению в том случае, если у <нет соответствующего> или он не является частью структуры документа. Это может произойти с неверным XML, или в разделах CDATA и тому подобном. Это становится сложным, но может быть сделано с помощью рекурсивных регулярных выражений. Однако я не знаю библиотеки регулярных выражений в c ++, которая поддерживает рекурсию. Извините, но было бы намного проще просто проанализировать ваши строковые данные вручную.
Теперь некоторые диалекты регулярных выражений отличаются, поэтому ваш пробег может отличаться. Для справки, хотя я склонен использовать
http://www.regular -expressions.info / quickstart.html