std :: regex无法识别$

Yakibuta拉面

我尝试使用正则表达式解析文件的内容:

ifstream file_stream("commented.cpp",ifstream::binary);

std::string txt((std::istreambuf_iterator<char>(file_stream)),
std::istreambuf_iterator<char>());

cmatch m;
bool result = regex_search(txt.c_str(), m, regex("^#(\S*)$",regex_constants::basic));

该文件是ac源,它以以下行开头:

#include <stdio.h>

我正在尝试解析指令,我在regexbuddy中检查了regexp,它可以100%工作,但是在std :: regex中regex_search返回false。看来,$字符不gettinc认可,也^posix语法。我尝试使用ECMAScript,并且正则表达式有效,仅当我删除$符号时。

//ecmascript syntax
bool result = regex_search(txt.c_str(), m, regex("^#(\S*)"));

使用二进制标志读取文件,因此txt字符串保留\r\n$语法所需的所有字符我寻求帮助,如何解决此问题。

维克多·史翠比维

请注意,$在大多数情况下锚仅用作字符串结尾(整个输入)锚。看到这个线程您可以$通过使用基于正向超前的自定义边界图案来使行位置的匹配结束(?=$|\r?\n)

另一个问题是您\S在常规字符串文字中使用转义序列。这意味着,它被视为S字母,而不是非空白模式。使用原始字符串字面量,这样你可以使用一个单一的\定义正则表达式转义序列(其中\逃脱ds等应该是文字反斜杠)。\使用常规字符串文字进行两次转义

另外,@ HWalters已经指出,^#\S+$不会匹配#include <stdio.h>,您需要在其中占一个空间。因此,您的regex可能看起来像^#include[ \t]+(\S+)(?=$|\r?\n),以确保具有#include,然后是一些水平空格,然后捕获+直到字符串末尾或换行符(CRLF或换行符)的任意数量(此处为1或更多,带有)个非空白字符。如果)。

这是一个片段

regex r(R"(^#include[ \t]+(\S+)(?=$|\r?\n))");
string s("#include <stdio.h>\r\n#include <regex>");
smatch m;
if (regex_search(s, m, r)) {
    std::cout << m[1] << std::endl;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章