0

所以,我有一个示例文件,我试图一次读取一行。根据该行的第一个单词,我想确定如何处理它的其余部分。

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 功能,虽然我可以让它做我想做的事,但正则表达式方法承诺会更干净。

所以,我的问题,在一行中:

在没有 Boost 库的情况下,在 Visual Studio 2010 的 Visual c++ 中使用 regex_iterator() 函数的正确代码是什么,以便按照我的描述拆分子组?

有没有办法在标准正则表达式库中使用命名子组(a la Perl)?

4

1 回答 1

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);

根据具体情况,您可能希望使用 anstd::map而不是std::set. 这将让您存储正则表达式(可能还有对某些代码的引用)以匹配和处理该行的其余部分。

于 2013-10-24T01:11:23.003 回答