正则表达式匹配需要永远

时间:2018-02-12 19:19:44

标签: c++ regex linux c++11

我有一个大约30行的简单文本文件,如下所示:

A 45.0 X 250.0  
Y -23.8
A 22.0 X -1016.0
Y 4.9
L 0
M 16.1 T 0 N 0

...etc...
...etc...

每行包含1到3对大写字母和浮点数。所有分隔符都是空格 然后我创建了一个程序,用这个简单的正则表达式检查该文件的每一行:

std::ifstream stream;
try
{
    stream.open("/ArchivioProgrammi/p1.prg", std::ios::in);
}
catch(std::exception& e)
{
    std::stringstream st;
    st << "Error opening file.\nError:   " << e.what();
    throw MyLoadException(st.str());
}
std::string line;
unsigned int lineCount = 0;

while(std::getline(stream, line))  //  Per ogni linea del file estraggo fino a 6 token
{
    if(line.length() == 0) continue;

    /***  This "if" hangs indefinitely!!  ***/
    if(!std::regex_match(line, std::regex("([A-Z] [\\-\\+]?[0-9]+(\\.[0-9]+)?)( [A-Z] [\\-\\+]?[0-9]+(\\.[0-9]+)?){0,2}")))
    {
        std::stringstream st;
        st << "Line #" << lineCount << " is invalid.";
        throw MyLoadException(st.str());
    }

    //  Tokenize the line and do something with the tokens...

    ++lineCount;

}

if(stream.eof())
{
    stream.close();
}

每当控件到达if时,程序就会永远挂起!界面无响应,没有错误,没有falsetrue!为什么呢?

我正在使用OpenSuse最新版本的KDevelop进行开发。

2 个答案:

答案 0 :(得分:0)

使用原始字符串,它就像一个魅力。 即使我从来没有理解用双引号和括号开始这样的字符串的含义....

我怎么用较短的形式编写正则表达式?

答案 1 :(得分:0)

尝试通过在线测试确认您的正则表达式是否正确(例如online Regex tester)。您可能还想考虑一次使用一行上的正则表达式逐行迭代输入文件。或者根本不使用正则表达式。