我收到2个正则表达式作为输入。我在C和C ++中工作(被告知这两个选项都可以,但是我大多数都是C语言的熟练者)。收到的正则表达式必须逐行应用于stdin上的文件。我使用以下代码:
int res;
line = read_line(&res);
while (res) {
printf("%s\n",line);
std::string input_line = line;
std::string to_replace = argv[1];
std::string new_regex = argv[2];
std::regex_replace(input_line, to_replace, new_regex);
printf("%s\n", input_line);
free(line)
line = read_line(&res);
}
但是我对regex_replace函数有问题-似乎可以使用C ++对象,但是我不知道如何将输入参数转换为std :: regex。我尝试将其转换为std :: string,然后转换为std :: regex,但是没有用。我将不胜感激。
答案 0 :(得分:2)
Matthieu已经提到过该文档。 cppreference.com
上std::regex_replace()的数量。
std::regex_replace()
有多种风味。其中一些使用迭代器作为参数。这对于std库算法来说非常常见,因为它使它们使用起来非常灵活,即适用于可以迭代的最广泛的事物,包括容器模板,数组和字符串(尽管可能会有其他限制来减少它们)。>
在这种情况下,我选择(就我而言)最方便的口味:
template< class Traits, class CharT,
class STraits, class SAlloc >
std::basic_string<CharT,STraits,SAlloc>
regex_replace( const std::basic_string<CharT,STraits,SAlloc>& s,
const std::basic_regex<CharT,Traits>& re,
const CharT* fmt,
std::regex_constants::match_flag_type flags =
std::regex_constants::match_default );
对于我的具体类型,可以这样读取:
std::string std::regex_replace(
const std::string &s, // the input string to process
const std::regex &re, // the regular expression to apply
const char *fmt, // the replacement text
std::regex_constants::match_flag_type flags
= std::regex_constants::match_default);
OP的另一个“缺失部分”似乎是因为regex_replace()
的第二个 nd 自变量是std::regex
的一个实例。
OP的专线
std::regex_replace(input_line, to_replace, new_regex);
有三个问题:
std::regex
实例作为2 nd 自变量。修复程序如下:
input_line
= std::regex_replace(input_line, std::regex(new_regex), to_replace);
显式调用std::regex::regex()
作为文档是必要的。 std::regex::regex()的内容显示:
explicit regex(
const char *text,
flag_type f = std::regex_constants::ECMAScript);
以及
explicit regex(
const std::string &text,
flag_type f = std::regex_constants::ECMAScript);
标记为explicit
,即它们不会自动应用于给定const char*
或std::string
的转换。
由于正则表达式只给出一次(在命令行参数中),但可能会应用于许多行,因此我建议在循环外构造它。就性能而言,正则表达式并不便宜。我经常阅读建议使用预编译的提示。
将所有这些放在一起,得到了以下示例testRE.cc
:
#include <iostream>
#include <regex>
#include <string>
int main(int argc, char **argv)
{
// a minimal check of command line arguments
if (argc != 3) {
std::cerr << "ERROR! Wrong number of command line arguments.\n"
<< "Usage:\n"
<< " " << argv[0] << " REPLACE REGEX\n";
return 1;
}
// configure replace and regex
const char *const replace = argv[1];
const std::regex regexpr(argv[2]);
// process standard input
for (std::string line; std::getline(std::cin, line);) {
line = std::regex_replace(line, regexpr, replace);
std::cout << line << '\n';
}
// done
return 0;
}
经过编译和测试:
$ g++ -std=c++11 -O2 -Wall -pedantic testRE.cc -o testRE
$ (cat | ./testRE "cat" 'd(og|uck)') <<EOF
The quick brown fox jumps over the lazy dog.
My black cat looks to the white duck.
EOF
The quick brown fox jumps over the lazy cat.
My black cat looks to the white cat.
$
联系方式