ECMAScript Regex用于多行字符串

时间:2013-06-16 12:23:57

标签: c++ regex c++11 ecmascript-5 standard-library

我正在为我的应用程序编写加载过程,它涉及从文件中读取数据并创建具有适当属性的适当对象。

该文件由以下格式的顺序条目(由换行符分隔)组成:

=== OBJECT TYPE ===
<Property 1>: Value1
<Property 2>: Value2
=== END OBJECT TYPE ===

其中值通常是字符串,可能包含任意字符,换行符等。

我想创建一个可以匹配此格式的std::regex,并允许我使用std::regex_iterator依次将每个对象读入文件。

但是,我在创建匹配此类格式的正则表达式时遇到问题;我已经查看了ECMAScript语法并按以下方式创建了我的正则表达式,但它与我的测试应用程序中的字符串不匹配:

const std::regex regexTest( "=== ([^=]+) ===\\n([.\\n]*)\\n=== END \\1 ===" );

在以下测试应用程序中使用它时,它无法将正则表达式与字符串匹配:

int main()
{
    std::string testString = "=== TEST ===\n<Random Example>:This is a =test=\n<Another Example>:Another Test||\n=== END TEST ===";

    std::cout << testString << std::endl;

    const std::regex regexTest( "=== ([^=]+) ===\\n([.\\n]*)\\n=== END \\1 ===" );
    std::smatch regexMatch;

    if( std::regex_match( testString, regexMatch, regexTest ) )
    {
        std::cout << "Prefix: \"" << regexMatch[1] << "\"" << std::endl;
        std::cout << "Main Body: \"" << regexMatch[2] << "\"" << std::endl;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

你的问题比看上去简单得多。这样:

const std::regex regexTest( "=== ([^=]+) ===\\n((?:.|\\n)*)\\n=== END \\1 ===" );

在clang ++ / libc ++上完美运行。似乎\n不适合ECMAscript regexen中的[]括号。如果您想在字符串中查找多个正则表达式实例,请记住使用while regex_search而不是if regex_match

答案 1 :(得分:0)

尝试使用:

  1. 懒惰量词:

    === (.+?) ===\\n([\\s\\S]*?)\\n=== END \\1 ===

  2. 否定类和否定前瞻:

    === ((?:[^ ]+| (?!===))+) ===\\n((?:[^\\n]+|\\n(?!=== END \\1 ===))*)

  3. POSIX:

    === (.+?) ===\n((.|\n)*?)\n=== END [^=]+? ===