【问题标题】:ECMAScript Regex for a multilined string多行字符串的 ECMAScript 正则表达式
【发布时间】:2013-06-12 13:36:57
【问题描述】:

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

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

=== 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;
}

【问题讨论】:

  • 你用的是什么编译器?您是否知道 str::regex 在某些编译器中没有(完全/根本)实现? g++ 特别是(我上次检查过)。
  • @Qtax 我正在使用 Microsoft Visual Studio 2012 和附带的标准库实现,据我所知,它提供了 std::regex 和相关函数的完整实现。跨度>
  • @Shaktal 你可以尝试删除部分表达式(以获取匹配的部分)以查看哪个部分破坏了模式?

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


【解决方案1】:

您的问题比看起来要简单得多。这个:

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

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

【讨论】:

  • 非常感谢,这正是我想要的!
【解决方案2】:

尝试使用:

  1. 惰性量词:

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

  2. 负类和负前瞻:

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

  3. POSIX:

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

【讨论】:

  • 这两个正则表达式都不匹配字符串,尽管编译时都没有抛出异常。感谢您的帮助!
  • 我已尝试编辑,但第一个无法匹配,第二个导致生成运行时错误。
  • 我已经尝试了您的 POSIX 实现,没有产生运行时错误,并且正则表达式编译成功,但它与我的测试字符串不匹配。感谢您迄今为止的所有帮助!
  • @Shaktal:你有没有用像a 这样的愚蠢例子进行测试以匹配a
  • 是的,如果我说字符串 "abbc" 和正则表达式 "a([b]+)c" 它完全匹配。
猜你喜欢
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2015-01-11
  • 2015-08-22
相关资源
最近更新 更多