テキスト内でシングルパス検索と置換を行う方法を知っている人はいますか? 私は、すべてのマイクロ最適化が重要な高性能プログラムに取り組んでいます。以下は、私が現在行っていることを示す例です。
#include <iostream>
#include <string>
/*!
\brief Replaces all common character escape sequences with text representations
\note Some character seqences messes up the trace output and must be replaces
* with text represantions, ie. the newline character will the replaced with "\n"
* etc.
\returns The formatted string
*/
std::wstring ReplaceAll(std::wstring &str)
{
SearchAndReplace(str, L"\a", L"\\a"); // control-g, C-g
SearchAndReplace(str, L"\b", L"\\b"); // backspace, <BS>, C-h
SearchAndReplace(str, L"\t", L"\\t"); // tab, <TAB>, C-i
SearchAndReplace(str, L"\n", L"\\n"); // newline, C-j
SearchAndReplace(str, L"\v", L"\\v"); // vertical tab, C-k
SearchAndReplace(str, L"\f", L"\\f"); // formfeed character, C-l
SearchAndReplace(str, L"\r", L"\\r"); // carriage return, <RET>, C-m
return str;
}
/*!
\brief Wide string search and replace
\param str [in, out] String to search & replace
\param oldStr [in] Old string
\param newStr [in] New string
*/
std::wstring SearchAndReplace(std::wstring &str, const wchar_t *oldStr, const wchar_t *newStr) const
{
size_t oldStrLen = wcslen(oldStr);
size_t newStrLen = wcslen(newStr);
size_t pos = 0;
while((pos = str.find(oldStr, pos)) != string::npos)
{
str.replace(pos, oldStrLen, newStr);
pos += newStrLen;
}
return str;
}
int main()
{
std::wstring myStr(L"\tThe quick brown fox jumps over the lazy dog.\n\tThe quick brown fox jumps over the lazy dog\n\n");
std::wcout << L"Before replace: " << myStr;
std::wcout << L"After replace: " << ReplaceAll(myStr);
return 0;
}
上記のコードは、同じ文字列を複数回通過する必要があるため、明らかに非効率的です。単一パスの検索および置換機能は、置換する文字のさまざまな配列を処理できるように非常に柔軟でなければなりません (つまり、 にリストされているエスケープ文字だけではありませんReplaceAll()
)。