Заменить подстроку другими заменяющими строками - PullRequest
0 голосов
/ 06 августа 2020

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

Например, если я начну с "%{animal} and %{animal}", я хотел бы заменить два тега% {animal} на «кошки» и «собаки», чтобы get "cats and dogs".

Очевидно, самым простым решением было бы начать с "%{animal1} and %{animal2}", но в этом случае я не могу.

Обычно я бы предпочел использовать QString :: replace, но я не могу найти вариант, который заменит только первый экземпляр его перед аргументом.

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

Обновление / разрешение

В комментарии я описал, как я пишу функцию для проверки того, что несколько генераторов с одинаковыми интерфейсами все производят ожидаемые строки в различных обстоятельствах. Чтобы обеспечить необходимую гибкость, я включил тег, фактически имеющий форму %{...}, в ожидаемую строку и передал текст, который должен заменить тег в качестве аргумента функции. Это хорошо сработало для первой пары генераторов, но третий заменяет тег дважды с разными значениями.

Мой первоначальный план по преодолению этого состоял в том, чтобы передать вектор строк подстановки и заменить первое вхождение тега на первая строка подстановки, вторая со второй, et c. Это провалилось, когда я не смог найти функцию-член QString, которая заменила бы одну подстроку другой в ограниченной части строки.

Поразмыслив над этим вопросом в течение ночи, я теперь понимаю, что лучше передать вектор пар {tag, replace} моей функции. Это даст мне возможность включать разные теги в ожидаемую строку результата, передавать их определения в тестовую функцию и использовать QString::replace sin c, каждый тег будет встречаться только один раз.

Если I действительно, нужно заменить только первое вхождение тега, я думаю, что я бы использовал QRegularExpression с шаблоном вроде (.*)(%{[^}]}(.*) для соответствия

<text before first tag> <first tag> <text after first tag>

а затем перестроить строку как

<first match> <replacement text> <third match>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...