所以,我有一个示例文件,我试图一次读取一行。根据该行的第一个单词,我想确定如何处理它的其余部分。
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)?