• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Wie Bugreport machen: std::regex vs boost::regex

schorsch_76

FreeBSD Fanboy
Themenstarter #1
Ich habe ein kleines Problem: ich habe eine Anwendung welche oft regexes einsetzt. Hier habe ich eigenlich immer std::regex verwendet. Unter Linux + Windows matched mein regex immer. Unter FreeBSD 12 mit clang nicht. Dann hab ich das ganze in eine Minianwendung gepackt und gebaut, hier matcht der Regex.

In meiner Anwendung hab ich jetzt den Regex zum umschalten gemacht (boost/std). Mit boost::regex klappt es. Warum nicht mit std?

Das hier triggert den Bug noch nicht, aber in meiener Anwendung klappt der Match auf "Date" nicht.

Ich hatte so einen ähnlichen Bug mal unter gcc und Linux und dort konnte ich dann einen Testcase erzeugen und reporten. Nur was mach ich wenn es hier nicht reproduzierbar ist (zumindest in meinem Miniprogram? :confused:

Code:
#include <regex>
#include <string>
#include <iostream>
#include <sstream>

const std::string test {{
"Author: aaa\n"
"Ti: test\n"
"S: test\n"
"Date: 2018-12-09 14:40:27\n"
"T1: test\n"}};


int main(int argc, char** argv)
{

    std::regex re_author("^Author\\s*:[\\s\\t]*(.*?)$",
                        std::regex_constants::icase);
    std::regex re_title("^Title\\s*:[\\s\\t]*(.*?)$",
                        std::regex_constants::icase);
    std::regex re_slug("^Slug\\s*:[\\s\\t]*(.*?)$",
                       std::regex_constants::icase);
    std::regex re_datetime("^Date\\s*:[\\s\\t]*(\\d{4}\\-\\d{2}\\-\\d{2} "
                            "\\d{2}:\\d{2}:\\d{2}?)$",
                            std::regex_constants::icase);

    std::string line;
    std::istringstream iss(test);
    std::smatch match;

    bool ok = false;
    while (std::getline(iss, line))
    {
        if (regex_match(line, match, re_author) && match.size() > 1)
        {
            // do stuff           
        }
        else if (regex_match(line, match, re_title) && match.size() > 1)
        {
            // do stuff           
        }
        else if (regex_match(line, match, re_slug) && match.size() > 1)
        {
            // do stuff           
        }
        else if (std::regex_match(line, match, re_datetime) && match.size() > 1)
        {
            ok = true;
        }
    }
   
    if (ok)
    {
        std::cout << "All ok" << std::endl;
    }
    else
    {
        std::cout << "Bug triggered" << std::endl;
    }
}