Заменить некоторые символы в строке на следующий символ юникода в Rust

У меня есть входной текст следующим образом:

 inputtext = "This is a test";

Мне нужно заменить некоторые символы (на основе определенных критериев) на следующий символ Юникода

 int i=0;
 for c in inputtext.chars() {
   if (somecondition){
     //replace char here
     inputtext.replace_range(i..i+1,newchar);
     //println!("{}", c);


 }

Как лучше всего это сделать? Спасибо.

Похоже, вам может понадобиться пользовательский Iterator, но трудно сказать наверняка, не зная точно, каковы критерии и символы замены.

cdhowie 10.04.2022 15:50

символы замены - это просто следующий символ Юникода. критерий (какое-то условие) есть вероятность.

Saqib Ali 10.04.2022 15:54

Тогда вы, вероятно, можете просто использовать inputtext.chars().map(|c| if somecondition { /* replacement logic */ } else { c })

cdhowie 10.04.2022 15:59
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы не можете легко обновить строку на месте, потому что строка Rust — это не просто массив символов, это массив байты (в кодировке UTF-8), и разные символы могут использовать разное количество байтов. Например, символ ߿ (U + 07FF «Знак Нко Таман») использует два байта, тогда как следующий символ Юникода (U + 0800 «Самаритянская буква алаф») использует три.

Поэтому проще всего превратить строку в итератор символов (используя .chars()), манипулировать этим итератором соответствующим образом, а затем создать новую строку, используя .collect().

Например:

let old = "abcdef";

let new = old.chars()
    // note: there's an edge case if ch == char::MAX which we must decide
    //       how to handle. in this case I chose to not change the
    //       character, but this may be different from what you need.
    .map(|ch| {
        if somecondition {
            char::from_u32(ch as u32 + 1).unwrap_or(ch)
        } else {
            ch
        }
    })
    .collect::<String>();

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