Regexp捕获崩溃了代码

时间:2018-02-14 08:18:23

标签: c++ regex

我正在试图弄清楚c ++中的正则表达式是如何运作的,所以我做了这个例子,我尝试了不同的正则表达式,看看它们是否匹配:

# Colour set up
class colours:
    warning = '\033[93m'
    colour1 = '\033[94m'
    colour2 = '\033[1m'
    terminate = '\033[0m'

# Logger set up
class Logger(object):
    def __init__(self):
        self.terminal = sys.stdout
        self.log = open(“output.log”, "a")

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)

sys.stdout = Logger()

# Example
print colours.warning + ‘WARNING!’ + colours.terminate

*in colour*:$ WARNING!

*in output.log*: [93mWARNING!

结果如下:

#include <regex>

int main(){

    while (true) {
        string needle;
        cin >> needle;
        regex regexp(needle);
        std::smatch smatch;
        string haystack = "caps.caps[0].MainFormat[0].Video.BitRateOptions = 896, 1536";

        bool match = regex_search(haystack, smatch, regexp);

        if (match) {
            cout << "Matched" << endl;
        }
        else {
            cout << "Mismatch" << endl;
        }
    }
}

为什么caps.caps[0].MainFormat[0].Video.BitRateOptions Mismatch (caps.caps[0].MainFormat[0].Video.BitRateOptions) Mismatch caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions Matched (caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions) Matched caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions= Mismatch (caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions=) Mismatch caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions = Matched Matched (caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions =) THIS ONE BREAK THE PROCESS AND ENDS caps.caps\[0] THIS ONE BREAK THE PROCESS AND ENDS 会返回两个匹配项,为什么捕获此正则表达式会导致代码崩溃?基于此,我假设当我想匹配'['或']'时,我需要逃避它,也许还有一些其他情况,错误构造的regexp可能会使进程崩溃。是否有任何选项可以处理未转义的'['或']'和其他错误的正则表达式,因此代码不会崩溃而是不匹配?我在Windows 10上使用Visual Studio 2017.谢谢

1 个答案:

答案 0 :(得分:2)

第一个

  

大写字母\ .caps \ [0 \] \ .MainFormat \ [0 \] \ .Video \ .BitRateOptions =

返回两个匹配项,因为std::cin >> needle;只读取直到找到第一个空格字符(第一个匹配项)。然后它会读取下一个“单词”=,它会给出第二个匹配。

下一个

会发生类似的行为
  

(caps \ .caps \ [0 \] \ .MainFormat \ [0 \] \ .Video \ .BitRateOptions =)

第一部分是(...,不包括第一个空格。现在正则表达式不完整并抛出异常。 使用g ++,这看起来像

  

在抛出'std :: regex_error'实例后终止调用     what():regex_error

如果您想要完整的行,请使用std::getline代替

while (std::getline(std::cin, needle)) {
// ...
}

我不能用最后一个重现任何中止

  

caps.caps \ [0]

按预期返回匹配项。