Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;正则表达式匹配多行_C++_Regex - Fatal编程技术网

C++ C++;正则表达式匹配多行

C++ C++;正则表达式匹配多行,c++,regex,C++,Regex,我试图在以下输入字符串上模拟一个简单汇编程序的工作(作为CS课程的一部分):“MOV R\nADD R\nSUB 30\nSTORE 1000\nHALT” 我想将各个指令从该字符串中分离出来。因此,我使用了以下正则表达式模式:“^.+$”,这意味着它应该匹配以新行开头和结尾的一个或多个字符 但是,C++ RexExx匹配函数没有得到该模式的任何匹配。但一位在线测试人员告诉我,这种模式正好满足了我的需求 下面是我试图提取指令的代码片段: regex regInst("^.+$", regex::

我试图在以下输入字符串上模拟一个简单汇编程序的工作(作为CS课程的一部分):“MOV R\nADD R\nSUB 30\nSTORE 1000\nHALT”

我想将各个指令从该字符串中分离出来。因此,我使用了以下正则表达式模式“^.+$”,这意味着它应该匹配以新行开头和结尾的一个或多个字符

但是,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 );
}