我正在为类的交叉引用生成器工作。在这个项目中,我们将迭代一个文件并列出所有单词及其行号和该行上出现的次数,如下所示:
答: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)"
希望这是有道理的。
答案 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
,因为word
是std::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));
进入您的代码,以防您在忘记此问题一年后尝试重复使用代码。这样,编译器会提醒你。