একটি স্ট্রিংয়ের সমস্ত উপস্থিতিগুলিকে অন্য স্ট্রিংয়ের সাথে প্রতিস্থাপন করার কোনও উপায় আছে কি std::string
?
এই ক্ষেত্রে:
void SomeFunction(std::string& str)
{
str = str.replace("hello", "world"); //< I'm looking for something nice like this
}
একটি স্ট্রিংয়ের সমস্ত উপস্থিতিগুলিকে অন্য স্ট্রিংয়ের সাথে প্রতিস্থাপন করার কোনও উপায় আছে কি std::string
?
এই ক্ষেত্রে:
void SomeFunction(std::string& str)
{
str = str.replace("hello", "world"); //< I'm looking for something nice like this
}
উত্তর:
আপনার নিজস্ব প্রতিস্থাপন বাস্তবায়ন করছেন না কেন?
void myReplace(std::string& str,
const std::string& oldStr,
const std::string& newStr)
{
std::string::size_type pos = 0u;
while((pos = str.find(oldStr, pos)) != std::string::npos){
str.replace(pos, oldStr.length(), newStr);
pos += newStr.length();
}
}
#include <boost/algorithm/string.hpp> // include Boost, a C++ library
...
std::string target("Would you like a foo of chocolate. Two foos of chocolate?");
boost::replace_all(target, "foo", "bar");
এখানে প্রতিস্থাপন_এর সরকারী ডকুমেন্টেশন রয়েছে।
replace_all
কোনও সংস্করণের জন্য সান স্টুডিওতে>> 1.43 এর সংস্করণে সেগফল্ট করবে <12.3
boost
এম্বেড থাকা ডিভাইসগুলিতে যথেষ্ট সংকলন সময় বৃদ্ধি করে। এমনকি এআরএমভি 7 কোয়াড কোর 100 লাইন কোড 2 মিনিটের মধ্যে 2 মিনিটের মধ্যেই কমপাইল করে, 2 সেকেন্ডে।
সি ++ 11 এ আপনি কল করার মাধ্যমে ওয়ান-লাইনার হিসাবে এটি করতে পারেন regex_replace
:
#include <string>
#include <regex>
using std::string;
string do_replace( string const & in, string const & from, string const & to )
{
return std::regex_replace( in, std::regex(from), to );
}
string test = "Remove all spaces";
std::cout << do_replace(test, " ", "") << std::endl;
আউটপুট:
Removeallspaces
from
এটি একটি নিয়মিত প্রকাশ হতে পারে - তাই আপনার প্রয়োজনের সাথে আপনি আরও পরিশীলিত মিলের মানদণ্ড ব্যবহার করতে পারেন। আমি কি দেখতে না কিভাবে এই কাজ করতে হয় ছাড়া পরিবর্তে শুধুমাত্র সরাসরি ব্যাখ্যা ব্যবহার করে - রেগুলার এক্সপ্রেশন পার্স কিছু ফর্ম আবেদন from
অক্ষর।
কেন একটি পরিবর্তিত স্ট্রিং ফিরে না?
std::string ReplaceString(std::string subject, const std::string& search,
const std::string& replace) {
size_t pos = 0;
while((pos = subject.find(search, pos)) != std::string::npos) {
subject.replace(pos, search.length(), replace);
pos += replace.length();
}
return subject;
}
আপনার যদি পারফরম্যান্সের প্রয়োজন হয় তবে এখানে একটি অনুকূলিত ফাংশন যা ইনপুট স্ট্রিংটি সংশোধন করে, এটি স্ট্রিংয়ের অনুলিপি তৈরি করে না:
void ReplaceStringInPlace(std::string& subject, const std::string& search,
const std::string& replace) {
size_t pos = 0;
while((pos = subject.find(search, pos)) != std::string::npos) {
subject.replace(pos, search.length(), replace);
pos += replace.length();
}
}
পরীক্ষা:
std::string input = "abc abc def";
std::cout << "Input string: " << input << std::endl;
std::cout << "ReplaceString() return value: "
<< ReplaceString(input, "bc", "!!") << std::endl;
std::cout << "ReplaceString() input string not changed: "
<< input << std::endl;
ReplaceStringInPlace(input, "bc", "??");
std::cout << "ReplaceStringInPlace() input string modified: "
<< input << std::endl;
আউটপুট:
Input string: abc abc def
ReplaceString() return value: a!! a!! def
ReplaceString() input string not modified: abc abc def
ReplaceStringInPlace() input string modified: a?? a?? def
আমার টেম্পলেটাইজড ইনলাইন ইন-প্লেস-এ-সন্ধান এবং প্রতিস্থাপন:
template<class T>
int inline findAndReplace(T& source, const T& find, const T& replace)
{
int num=0;
typename T::size_t fLen = find.size();
typename T::size_t rLen = replace.size();
for (T::size_t pos=0; (pos=source.find(find, pos))!=T::npos; pos+=rLen)
{
num++;
source.replace(pos, fLen, replace);
}
return num;
}
এটি প্রতিস্থাপিত আইটেমগুলির সংখ্যার একটি গণনা প্রদান করে (আপনি যদি ধারাবাহিকভাবে এটি চালাতে চান তবে ব্যবহারের জন্য)। এটি ব্যবহার করতে:
std::string str = "one two three";
int n = findAndReplace(str, "one", "1");
সবচেয়ে সহজ উপায় (আপনি যা লিখেছেন তার কাছে কিছু সরবরাহ করা) বুস্ট.আরেজেক্স , বিশেষত regex_replace ব্যবহার করা ।
std :: স্ট্রিং () এবং () পদ্ধতিগুলি প্রতিস্থাপনে তৈরি করেছে তবে সূচকগুলি এবং স্ট্রিংয়ের দৈর্ঘ্যের সাথে ডিলিংয়ের প্রয়োজন হওয়ায় এগুলি কাজ করা আরও জটিল।
আমি বিশ্বাস করি এটি কার্যকর হবে। এটি প্যারামিটার হিসাবে কনস্টের চর * লাগে।
//params find and replace cannot be NULL
void FindAndReplace( std::string& source, const char* find, const char* replace )
{
//ASSERT(find != NULL);
//ASSERT(replace != NULL);
size_t findLen = strlen(find);
size_t replaceLen = strlen(replace);
size_t pos = 0;
//search for the next occurrence of find within source
while ((pos = source.find(find, pos)) != std::string::npos)
{
//replace the found string with the replacement
source.replace( pos, findLen, replace );
//the next line keeps you from searching your replace string,
//so your could replace "hello" with "hello world"
//and not have it blow chunks.
pos += replaceLen;
}
}
size_type
স্ট্রিংয়ের জন্য এটি দেওয়া হয়েছে, লুপের অবস্থায় unsigned
আপনার >=
চেক সর্বদা থাকবে true
। আপনি std::string::npos
সেখানে ব্যবহার করতে হবে।
roll_down_window
#include <string>
using std::string;
void myReplace(string& str,
const string& oldStr,
const string& newStr) {
if (oldStr.empty()) {
return;
}
for (size_t pos = 0; (pos = str.find(oldStr, pos)) != string::npos;) {
str.replace(pos, oldStr.length(), newStr);
pos += newStr.length();
}
}
OldStr খালি থাকার জন্য পরীক্ষা করা গুরুত্বপূর্ণ। যে কারণেই যদি সেই প্যারামিটারটি খালি থাকে তবে আপনি একটি অসীম লুপে আটকে যাবেন।
তবে হ্যাঁ আপনি যদি পারেন তবে পরীক্ষিত ও পরীক্ষিত সি ++ 11 বা বুস্ট সলিউশনটি ব্যবহার করুন।
// Replace all occurrences of searchStr in str with replacer
// Each match is replaced only once to prevent an infinite loop
// The algorithm iterates once over the input and only concatenates
// to the output, so it should be reasonably efficient
std::string replace(const std::string& str, const std::string& searchStr,
const std::string& replacer)
{
// Prevent an infinite loop if the input is empty
if (searchStr == "") {
return str;
}
std::string result = "";
size_t pos = 0;
size_t pos2 = str.find(searchStr, pos);
while (pos2 != std::string::npos) {
result += str.substr(pos, pos2-pos) + replacer;
pos = pos2 + searchStr.length();
pos2 = str.find(searchStr, pos);
}
result += str.substr(pos, str.length()-pos);
return result;
}