C++ C++;正则表达式匹配多行
我试图在以下输入字符串上模拟一个简单汇编程序的工作(作为CS课程的一部分):“MOV R\nADD R\nSUB 30\nSTORE 1000\nHALT” 我想将各个指令从该字符串中分离出来。因此,我使用了以下正则表达式模式:“^.+$”,这意味着它应该匹配以新行开头和结尾的一个或多个字符C++ C++;正则表达式匹配多行,c++,regex,C++,Regex,我试图在以下输入字符串上模拟一个简单汇编程序的工作(作为CS课程的一部分):“MOV R\nADD R\nSUB 30\nSTORE 1000\nHALT” 我想将各个指令从该字符串中分离出来。因此,我使用了以下正则表达式模式:“^.+$”,这意味着它应该匹配以新行开头和结尾的一个或多个字符 但是,C++ RexExx匹配函数没有得到该模式的任何匹配。但一位在线测试人员告诉我,这种模式正好满足了我的需求 下面是我试图提取指令的代码片段: regex regInst("^.+$", regex::
但是,C++ RexExx匹配函数没有得到该模式的任何匹配。但一位在线测试人员告诉我,这种模式正好满足了我的需求
下面是我试图提取指令的代码片段:regex regInst("^.+$", regex::flag_type::icase | regex::flag_type::ECMAScript);
string input = "MOV R\nADD R\nSUB 30\nSTORE 1000\nHALT";
smatch instructions, opcode, operand;
regex_match(input, instructions, regInst); // *instructions* is empty after this
我正在使用Visual Studio 2013。我也尝试过使用以下模式:
- ^(.+)$
- (^.+$)+
^
和$
,因此^
只匹配字符串的开头,而$
匹配字符串的结尾,而不是锚定到行结尾
C++regex
库没有.NET regex所具有的多行/单行选项,因此您需要使用regex\u search
而不是regex\u match
,但正如我在回复您的原始帖子时所说的:您不应该使用正则表达式来解析汇编代码,使用regex作为粗糙的标记化工具就是使用pile-driver,而您只需要一把锤子:strtok
是您的朋友
char* input = "MOV R\nADD R\nSUB 30\nSTORE 1000\nHALT";
const char* delimiters = " \n"
char* token = strtok( input, delimiters );
while( token != nullptr ) {
cout << token << endl;
token = strtok( nullptr, delimiters );
}
请不要使用正则表达式来解析程序集代码。汇编代码不是正则语言的示例,因此无法通过正则表达式正确解析。尽管您使用正则表达式作为拆分字符串的手段(如果您使用的是C/C++,只需使用
strtok
),但从内存消耗的角度看,这是一个坏主意。只需使用一个简单的有限状态机解析器即可(这样可以将内存消耗降到最低)。但是在线测试人员能够正确地解析它。好的,但请看一下ECMAScript上的文档,它表示“^”意味着“要么是目标序列的开始,要么是在行终止符之后。”$表示“要么是目标序列的开始,要么是在行终止符之后。”行终止符包括“\n”,因此这应该是有效的。无论如何,我使用regex是因为我认为它会更容易(而且doc误导了我),但您的解决方案是干净简单的,所以谢谢:)@MrWarlock616^
和$
仅当您使用匹配标志类型时才匹配换行符。请看match\u not\u bol
和match\u not\u eol
(分别用于^
和$
)。对不起,我的意思是$意味着“要么是目标序列的结尾,要么在行终止符之前。”但这些标志不会阻止字符串开头和结尾的匹配吗?我会投票支持你,但我是新来的
const char input[] = "MOV R\nADD R\nSUB 30\nSTORE 1000\nHALT";
char* temp = calloc( sizeof(input), sizeof(char) );
strcpy( temp, input );
const char* delimiters = " \n"
char* token = strtok( temp, delimiters );
while( token != nullptr ) {
char delimiter = input[ token - temp ];
cout << token << endl;
switch( delimiter ) {
case ' ':
cout << token << " ";
break;
case '\n':
cout << endl << token << " ";
break;
}
token = strtok( nullptr, delimiters );
}