regex_replace
有6種不同的過載。 fmt
參數對於它們中的每一個都使用相同的方式:
用於替換每個匹配的字符串。 這可能包括格式說明符和轉義序列,這些格式說明符和轉義序列被它們所代表的字符替換。
每個6個重載的體育運動也被用於控制,一個flags
參數「fmt
是如何被格式化」。該fmt
相關的選項有:
format_default
:默認格式
使用標準格式規則取代匹配(即由ECMAScript中的使用替代方法)。
format_sed
sed格式化
使用與POSIX中的sed實用程序相同的規則來替換匹配項。
format_no_copy
無副本
替換匹配時,不會複製目標序列中與正則表達式不匹配的部分。
format_first_only
僅限第一個
只替換第一次出現的正則表達式。
請注意,沒有fmt
重載,也沒有flags
支持內聯代碼。所以答案是:不,沒有支持嵌入代碼的regex_replace
的變種。
但是,如果你願意配合使用STD算法regex_iterator
,你可以使用lambda來實現在線代碼。
const string foo("StackOverflow user: Jonathan Mee");
vector<string> bar;
transform(regex_iterator<string::const_iterator>(foo.cbegin(), foo.cend(), regex(".*:\\s*(.*)")),
regex_iterator<string::const_iterator>(),
back_inserter(bar),
[](const smatch& i){auto result = i.str();
if (!result.empty()){
result += (i.str(1) == "Jonathan Mee" ? " is AWESOME!" : " is ???");
}
return result;});
正如你可以看到拉姆達是在transform
採取在當前regex_iterator
的smatch
使用。這是非常可擴展到多行字符串,在string foo("StackOverflow user: Jonathan Mee\nStackOverflow user: user0");
示例中的輸出是:
StackOverflow的用戶:喬納森眉是真棒!
StackOverflow用戶:user0是???
很明顯,有一些折衷與smatch
與regex_replace
工作。其中str(1)
屬於str()
未指定。在這裏,我利用了foo
末尾的事實,而不是foo
中間的某處。但應該指出的是,Perl的e
修飾符也遇到了同樣的困難,所以我認爲這幾乎是平等的。