使用带有正则表达式c ++的变量名

时间:2015-08-01 20:20:08

标签: c++ regex

我正在为类的交叉引用生成器工作。在这个项目中,我们将迭代一个文件并列出所有单词及其行号和该行上出现的次数,如下所示:

答:49:1

a:9:1,10:1,12:2,14:1,17:2,19:1,26:1,27:1,28:2, :39:1,41:1,43:1,45:2,46:2,49:1,50:2,51:1,56:3, :81:1,82:1,94:1,111:1,112:1,114:1,117:1,132:1,135:1, :138:1,142:2,143:1,144:1,152:1,156:1,161:2,163:1,164:1, :167:1,169:1,175:1,182:2,190:1,192:1

我使用正则表达式和regex_iterator来查找每行每个单词的出现次数。 我的问题是如何使用变量名而不是字符串文字?

例如: 而不是:R"(\bthis\b)"

我想这样做:

string word = "this";
R"(\bword\b)"

希望这是有道理的。

1 个答案:

答案 0 :(得分:5)

R"(\bthis\b)"是一个原始字符串文字,而不是正则表达式文字,以防你想到的。 C ++中没有正则表达式文字,但std::regexp可以从字符数组或std::string构造。

所以你可以简单地做

string word = "this";
R"(\b)" + word + R"(\b)"

或等效地使用普通的旧字符串文字

string word = "this";
"\\b" + word + "\\b"

注意:在这两种情况下,结果都是std::string,因为wordstd::string。这与R"(\bword\b)"不同,#warning "word" needs proper quoting to avoid security vulnerabilities 是一个字符数组。以防万一差异很重要。

一句警告虽然:单词的内容可能来自程序外部。您需要引用它,因为它可能包含正则表达式中特殊的字符。否则,您可能正在为您的程序构建一个安全漏洞。除了你的导师之外没有其他人可以参加课堂练习你应该没问题,但最好仍然像

一样。
private Map<Integer, Map<Integer, Map<Integer, Chunk>>> chunks = new HashMap<Integer, Map<Integer, Map<Integer, Chunk>>>();

Map<Integer, Map<Integer, Chunk>> inner1 = new HashMap<Integer, Map<Integer, Chunk>>();
chunks.put(x, inner1);

Map<Integer, Chunk> inner2 = new HashMap<Integer, Chunk>();
inner1.put(y, inner2);

inner2.put(z, new Chunk(x, y, z, param1, param2));

进入您的代码,以防您在忘记此问题一年后尝试重复使用代码。这样,编译器会提醒你。