所以,我有一个示例文件,我试图一次读取一行。基于该行的第一个单词,我想确定如何处理其余部分。
baa made up text
squeak 954823
moo 0 321 123 45543
. ^
. more moo lines here, fixed in length
. v
squeak x
woof 8
oink 1 2 3 4 5 6 7 98 93 12 23 43
.
. more oink lines here, m in quantity, differing in length
.
woof x
baa x
//more text here
我现在只在这里使用。我有几个正则表达式用于处理这些格式的行。我正在整理的问题是如何正确地访问正确序列中的子组匹配。我发现的所有材料都是指GCC作为编译器,并且我遇到了与vc ++编译器不同的行为。我正在使用Visual Studio 2010。
我想验证每一行是否匹配:
^(baa|squeak|moo|woof|oink)\s(.*)
这是我在Expresso中编写/构建的语法,它似乎不是VC ++正则表达式所寻求的。现在,我将假设它是正确的 - 它确实描述了我想要的两个子组。
然后,让我们假设我们正在查看上面的第一个示例行,并且已经验证第一个子组匹配'baa',我想检查:第二个子组只是'x'还是由更多组成?如果它包含更多我将执行函数A(),否则我将执行函数B()。
然后,根据第一个子组匹配的单词,我想处理具有不同正则表达式的第二个子组,进一步切断子组的不同部分。不幸的是,似乎迭代匹配并不是完全线性的。
在我的阅读中,我遇到了一个名为regex_split()的boost :: regex函数,它似乎正在寻找我想要的东西,但它已被弃用了。
我也在关注boost :: tokenizer功能,虽然我可以让它做我想做的事,但正则表达式方法更加清晰。
所以,我的问题,一行:
在Visual Studio 2010中使用regex_iterator()函数在没有Boost库的情况下使用regex_iterator()函数以便按照我所描述的方式拆分子组是什么?
有没有办法使用带有标准正则表达式库的命名子组(la Perl)?
答案 0 :(得分:0)
考虑到你正在处理的正则表达式的无关紧要,我会说正确的方法就是不要为这项工作打扰正则表达式。我只是做了类似的事情:
std::set permitted{"baa", "squeak", "moo", "woof", "oink"};
std::string head, tail;
while (infile >> head)
if (permitted.find(head) == permitted.end())
bad_input(head);
else
std::getline(infile, tail);
根据具体情况,您可能希望使用std::map
而不是std::set
。这将允许您存储正则表达式(可能还有一些代码的引用)来匹配和处理该行的其余部分。