RegEx заменяет пустые строки в C++

Я хочу удалить пустые строки во входной строке, используя regex_replace(); однако регулярное выражение "^\n" не работает в моем коде, хотя оно работает, когда я тестирую его на RegExr. Вот мой код:

    std::string s = "filler text\n\nfiller text";

    std::regex reg("^\n");

    std::cout << s;

    s = std::regex_replace(s, reg, "");

    cout << '\n' << s;

Выходы:

filler text

filler text
filler text

filler text

Должен ли я просто прибегнуть к замене любых двух символов новой строки только одним? Тогда мне придется зацикливаться, пока совпадений не будет найдено. Почему этот метод не работает, хотя, казалось бы, в нем нет ничего плохого?

Как вы ожидаете найти новую строку в начале строки?

Chris 18.08.2024 19:41

Зачем вам нужно регулярное выражение? Просто замените \n\n на \n.

Barmar 18.08.2024 19:41

Обратите внимание: даже если бы это сработало, вам все равно понадобится цикл, потому что regex_replace() не заменяет перекрывающиеся совпадения.

Barmar 18.08.2024 19:42

@Chris Поскольку это пустая строка, в ней нет ничего, кроме новой строки.

Youssef Gamil 18.08.2024 19:43

@Barmar Что вы имеете в виду, говоря не заменять перекрывающиеся совпадения?

Youssef Gamil 18.08.2024 19:44

Помогает ли определение вашего регулярного выражения с помощью необработанной строки? stackoverflow.com/q/56710024

Anerdw 18.08.2024 19:45

C++17: используйте std::regex_constants::multiline

Wiktor Stribiżew 18.08.2024 19:45

@Barmar, удалив все непересекающиеся пустые строки, не может создать новые пустые строки, здесь нет перекрытий...

STerliakov 18.08.2024 19:46

Почему мой вопрос был закрыт из-за дубликата? Тот факт, что ^ и $ совпадают с началом и концом строки, всегда не влияет на мой вопрос, поскольку я уже учел это.

Youssef Gamil 18.08.2024 19:47

О, это только в MSVC?

Youssef Gamil 18.08.2024 19:47

Предположим, есть 4 последовательных символа новой строки (3 пустые строки). ^\n заменит вторую новую строку в каждой паре, поэтому результатом будут 2 последовательные новые строки, поэтому остается пустая строка.

Barmar 18.08.2024 19:48

@STerliakov Он не создает новых строк, но не может удалить все пустые строки.

Barmar 18.08.2024 19:49

@Barmar Почему он заменяет только вторую часть каждой пары? Я проверил ваш сценарий на RexExr, но этого не произошло.

Youssef Gamil 18.08.2024 19:50

Методом кувалды было бы поместить строку в stringstream, прочитать ее обратно с помощью getline и отбросить пустые строки.

BoP 18.08.2024 19:51

@YoussefGamil Я был неправ, поскольку привязка представляет собой утверждение нулевой ширины, поэтому не считается частью совпадения.

Barmar 18.08.2024 19:52

Открыто вновь - номинированный обман не был (даже близок) к настоящему обману.

Jerry Coffin 18.08.2024 19:52

Хм, @Barmar, тогда это, вероятно, что-то специфическое для регулярного выражения С++, извини. Python r'(?m)^\n' удалит все пустые строки, а не только некоторые из них... Вероятно, это эквивалентно режиму std::regex_constants::multiline, предложенному выше?

STerliakov 18.08.2024 19:54

@YoussefGamil Пожалуйста, не используйте для этого регулярное выражение. Пока у нас не будет регулярного выражения constexpr и возможности оптимизировать такие простые задачи, как эта, это будет очень медленно по сравнению с простым поиском/заменой. Сравнение

Ted Lyngmo 18.08.2024 21:24

Как и почти каждый вопрос о регулярных выражениях, который я видел за последние десять лет, это совершенно тривиально, если вы не используете регулярные выражения, и, в лучшем случае, сложно и непонятно, если вы их используете. Я всегда считал, что добавление библиотеки регулярных выражений было ошибкой.

Pete Becker 18.08.2024 22:32

@PeteBecker Хе. У вас есть проблема. Вы решаете использовать регулярное выражение. Теперь у вас две проблемы...

catnip 19.08.2024 01:16

Я делаю это с <ranges>: auto refined = source | std::views::split('\n') | std::views::filter(std::not_fn(std::ranges::empty)) | std::views::join('\n') | std::ranges::to<std::string>();

Red.Wave 19.08.2024 07:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
21
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо того, чтобы иметь дело с «концом строки», я бы просто заменил несколько последовательных новых строк одной новой строкой:

#include <iostream>
#include <string>
#include <regex>

int main(int argc, char **argv) {
    std::string s = "filler text\n\nfiller text";

    std::regex reg("\n+");

    std::cout << "Before:\n";
    std::cout << s << "\nAfter:\n";

    s = std::regex_replace(s, reg, "\n");

    std::cout << '\n' << s << '\n';
}

Результат выглядит следующим образом:

Before:
filler text

filler text
After:

filler text
filler text

Другие вопросы по теме