C++正则表达式匹配行开头

3

我有一个长成这样的字符串

text here++ text
+ text text
+ text
text text

我想把行首的“+”替换为“-”,使得显示效果如下:
text here++ text
- text text
- text
text text

我正在尝试使用类似这样的正则表达式:

string text = "the-above-text";
regex reg("^\\++.*$");
text = regex_replace(text, reg, "-");

但是这个 ^ 只匹配文本的开头,而不是行的开头。

我已经谷歌了几个小时,似乎没有办法使引擎在多行模式下工作。

有没有办法可以做到这一点?或者是否有任何支持多行 ^ 和 $? 的更新的c ++标准? 我正在使用g ++

谢谢!


1
为什么你要用正则表达式呢?这只是一个微不足道的字符串操作。 - user2100815
使用 regex reg("(?:^|\n)\++.*$")。C++正则表达式中没有多行模式。 - Wiktor Stribiżew
@WiktorStribiżew,它说未知的转义序列。我用 \++ 替换了 ++,但现在它什么也没有替换 :) - LachoTomov
1
所以,您想要替换整行吗?还是只替换行首的1+ +符号?如果是后者,请使用https://ideone.com/leKxL3。 - Wiktor Stribiżew
1
@LachoTomov 这并不容易... 我认为你需要使用循环而不是一行的 regex_replace - xskxzr
显示剩余13条评论
2个回答

5

要匹配行首或行尾,请使用(^|\n)替代组。

要将每行开头的1个或多个+字符替换为单个-(连字符),请使用以下代码:

#include <iostream>
#include <regex>
using namespace std;
 
int main() {
    std::string s = "text here++ text\n+ text text\n+ text\ntext text";
    std::regex r("(^|\n)\\++");
    std::cout << std::regex_replace(s, r, "$1-") << std::endl;
    return 0;
}

查看C++演示

请注意,为了将换行符重新插入结果中,替换模式中使用引用第1组值的$1占位符(否则它将被删除)。


1

这对我有效。

#include <iostream>
#include <regex>

int main() {

    std::string text =
        "text here++ text\n" \
        "+ text text++\n"\
        "+ text++\n" \
        "text text";

    std::string result;
    std::regex re("(?:^|\n)\\++");
    result = std::regex_replace(text, re, "\n-");

    std::cout <<result << std::endl;
}

可以在这里看到运行情况


你在字符串开头添加了一个额外的换行符。我不知道为什么ideone.com没有显示这个换行符。 - xskxzr
@xskxzr:输入字符串不以“+”开头,因此在示例中未替换“^”。但对于其他输入确实会有问题。 - Jarod42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接