Заменить часть строки другой строкой

Вы можете использовать nth0 / 4: например,

update_mat_rc(Mc,R,C,V,Mu) :-
    nth0(R,Mc,Rc,Mt),
    nth0(C,Rc,_,Rt),
    nth0(C,Ru,V,Rt),
    nth0(R,Mu,Ru,Mt).

?- update_mat_rc([[1,2,3],[4,5,6],[7,8,9]],1,1,x,M).
M = [[1, 2, 3], [4, x, 6], [7, 8, 9]].

Обратите внимание на порядок и имена переменных, передаваемых в nth0 / 4.

У меня есть суффиксы переменных с c (например, Mc, Rc) для обозначения тока , с t для обозначения временно [ 117], с и означает обновлено .

170
задан Peter Mortensen 13 July 2016 в 11:40
поделиться

4 ответа

Есть функция для поиска подстроки в строке ( find ) и функция для замены определенного диапазона в строке другой строкой ( replace ), так что вы можете объедините их, чтобы получить желаемый эффект:

bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}

std::string string("hello $name");
replace(string, "$name", "Somename");

В ответ на комментарий, я думаю, replaceAll , вероятно, будет выглядеть примерно так:

void replaceAll(std::string& str, const std::string& from, const std::string& to) {
    if(from.empty())
        return;
    size_t start_pos = 0;
    while((start_pos = str.find(from, start_pos)) != std::string::npos) {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
    }
}
266
ответ дан 23 November 2019 в 20:47
поделиться

Это могло быть еще лучше для использования

void replace(string& input, const string& from, const string& to)
{
    while(true)
    {
        size_t startPosition = input.find(from);
        if(startPosition == string::npos)
            break;
        input.replace(startPosition, from.length(), to);
    }
}
0
ответ дан 23 November 2019 в 20:47
поделиться

Да, вы можете это сделать, но вам нужно найти позицию первой строки с помощью члена find () строки, а затем заменить его членом replace ().

string s("hello $name");
size_type pos = s.find( "$name" );
if ( pos != string::npos ) {
   s.replace( pos, 5, "somename" );   // 5 = length( $name )
}

Если вы планируете использовать Стандартную библиотеку, вам действительно стоит получить копию книги Стандартная библиотека C ++ , которая очень хорошо охватывает все это.

6
ответ дан 23 November 2019 в 20:47
поделиться

std :: string имеет метод replace , это то, что вы ищете?

Вы можете попробовать:

s.replace(s.find("$name"), sizeof("$name") - 1, "Somename");

У меня нет попробовал сам, просто прочтите документацию по find () и replace () .

18
ответ дан 23 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: