C++正则表达式匹配多行
C++ regex matching multiple lines
我正试图在以下输入字符串上模拟一个简单汇编程序的工作(作为CS课程的一部分):"MOV R\nADD R\nSUB 30\nSTORE 1000\nHALT"
我想把各个指令从那个字符串中分离出来。因此,我使用了以下正则表达式模式:"^.+$",这意味着它应该匹配一个或多个以新行开头和结尾的字符。
但是,C++regex_match函数没有得到该模式的任何匹配。但一位在线测试人员向我展示了这种模式正是我所需要的。
以下是我试图提取指令的代码片段:
regex regInst("^.+$", regex::flag_type::icase | regex::flag_type::ECMAScript);
string input = "MOV RnADD RnSUB 30nSTORE 1000nHALT";
smatch instructions, opcode, operand;
regex_match(input, instructions, regInst); // *instructions* is empty after this
我正在使用Visual Studio 2013。我也尝试过使用以下模式:
- ^(.+)$
- (^.+$)+
您在单行模式中使用锚^
和$
,因此^
只匹配字符串的开头,而$
匹配字符串的结尾,而不是锚定到行尾。
C++regex
库没有.NET regex所具有的多行/单行选项,所以您可能希望使用regex_search
而不是regex_match
,但正如我在回复您的原始帖子的评论中所说:您不应该使用正则表达式来解析程序集代码,而使用regex作为粗标记化工具就是在您只需要一把锤子的情况下使用打桩机:strtok
是您的朋友。
char* input = "MOV RnADD RnSUB 30nSTORE 1000nHALT";
const char* delimiters = " n"
char* token = strtok( input, delimiters );
while( token != nullptr ) {
cout << token << endl;
token = strtok( nullptr, delimiters );
}
请注意,strtok
是有状态的,这解释了以nullptr
为第一个参数的对strtok
的后续调用的不确定性。此处记录了这一点:http://www.cplusplus.com/reference/cstring/strtok/
还要注意,strtok
实际上修改了输入字符串,因此input
是char*
而不是const char* const
或string
(因为string::c_str()
返回const char*
)。
不幸的是,strtok
是C函数中的一个,它没有C++惯用的替代方法。您可以使用Boost的string::split
方法,但这引入了新的内存分配,而strtok
修改了字符串缓冲区,将分隔符转换为