Используя 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>
.