C ++正则表达式无法按预期工作(regex_search)

时间:2018-07-05 09:52:58

标签: c++ regex c++11

我目前正在使用C ++开发正则表达式,其中我试图在字符串中搜索子字符串。

问题:

字符串:

<Directory />
AllowOverride none
Require all denied
</Directory>

<Directory "C:/xampp/htdocs/dashboard">
Options +Indexes
AllowOverride None
Require all granted
</Directory>

在这里,我只需要第一个目录内容,即

<Directory />
AllowOverride none
Require all denied
</Directory>

因此我使用了正则表达式

Regex : < *Directory *\/? *>(\n.*?)+<\/Directory>

在此正则表达式中,我使用了 \ n。*?,以便它将返回第一个结果(惰性)。当我在https://regexr.com中尝试时,它工作正常,但是当我使用regex_search时,表明没有匹配项。这怎么可能?我有什么遗漏吗?

代码:

LPSTR logLocation = "C:\\xampp\\apache\\conf\\httpd.conf";

string logBuffer = RemoveCommentsFromFile(logLocation);

//cout<<logBuffer;

smatch match;
regex regx("< *Directory *\/? *>(\n.*?)+<\/Directory>");

if(regex_search(logBuffer,match,regx))
    cout<<match.str();

该代码基本上从文件中删除注释,并将其作为字符串返回。

1 个答案:

答案 0 :(得分:0)

经过数小时的浪费,我终于找到了适合的解决方案。 有两种正则表达式适用于此解决方案。

Solution 1 : < *Directory */? *>(\\n|.*)+?</Directory>

我使用了| (OR)在捕获组中使用惰性(?)运算符在第一个匹配项中停止。但是,我在问题中发布的正则表达式似乎在所有正则表达式测试人员中都能正常工作。

Solution 2 : < *Directory */? *>(\\s|\\S)+?</Directory>

只需用\ s和\ S替换换行符和任何字符(。)。

但是,众所周知(\ s | \ S)与[\ s \ S]相同,但是看起来捕获组有效,而第二个捕获组无效。

我不知道它是怎么发生的!