[英]Replace a character in one string with a character from another string in C++
[英]Regex to replace single occurrence of character in C++ with another character
我试图用不同的字符替换字符串中出现的单个字符“1”。
这个相同的字符可以在我不感兴趣的字符串中出现多次。
例如,在下面的字符串中,我想用 2 替换单个出现的 1。
input:-0001011101
output:-0002011102
我尝试了下面的正则表达式,但它给出了错误的结果
regex b1("(1){1}");
S1=regex_replace( S,
b1, "2");
任何帮助将不胜感激。
如果您使用boost::regex
,Boost regex 库,则可以简单地使用基于环视的解决方案,例如
(?<!1)1(?!1)
然后用2
替换。
使用std::regex
,您不能使用lookbehinds,但您可以使用一个正则表达式来捕获字符串的开头或除您的字符之外的任何一个字符,然后匹配您的字符,然后确保您的字符不会立即出现在右侧.
然后,您可以将$01
反向引用替换为 Group 1( 0
是必需的,因为$12
替换模式将被解析为 Group 12,此处为空字符串,因为匹配结构中没有 Group 12):
regex reg("([^1]|^)1(?!1)");
S1=std::regex_replace(S, regex, "$012");
#include <iostream>
#include <regex>
int main() {
std::string S = "-0001011101";
std::regex reg("([^1]|^)1(?!1)");
std::cout << std::regex_replace(S, reg, "$012") << std::endl;
return 0;
}
// => -0002011102
详情:
([^1]|^)
- 捕获组 1:除1
以外的任何字符( [^...]
是否定字符类)或字符串的开头( ^
是字符串锚的开头)1
- 1
字符(?!1)
- 如果当前位置右侧有1
字符,则匹配失败的负前瞻。标志std::regex_constants::format_first_only
告诉regex_replace()
只替换第一个匹配项而不是所有匹配项。
{1}
量词不这样做,它只是控制每个匹配中有多少字符,而不是完成多少替换。 除非以其他方式量化,否则所有模式都匹配一次,因此{1}
始终是多余的。
S1 = regex_replace(S, b1, "2", std::regex_constants::format_first_only)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.