C ++正则表达式,未知的转义序列' \。'警告

时间:2016-08-02 10:08:44

标签: c++ regex

我第一次尝试在C ++中使用正则表达式,我对转义序列有点困惑。我只是想在一个字符串的开头匹配一个点。为此,我使用表达式:" ^ \\\。",这有效,但我的编译器(g ++)生成警告:

warning: unknown escape sequence '\.'
        regex self_regex("^\\\.");
                             ^~

如果我使用例如" ^ \\。",它不会生成警告,但该正则表达式与我打算做的不符。

我也不明白为什么我必须使用三个反斜杠,不应该两个就足够了," \。"第一个反斜杠逃脱了第二个,所以我实际上搜索。,但它没有工作。有人可以帮我解释一下吗?

代码:

#include <iostream>
#include <dirent.h>
#include <regex>

using namespace std;

int main(void){
    DIR *dir;
    string path = "/Users/-----------/Documents/Bibliothek/MachineLearning/DeepLearning/ConvolutionalNeuralNetworks/CS231n 2016/Assignments/assignment3/assignment3/cs231n";
    regex self_regex("^\\\.+");
    struct dirent *ent;
    dir = opendir(path.c_str());
    if ((dir = opendir(path.c_str())) != NULL){
        while ((ent = readdir(dir)) != NULL){
            if (regex_search(string(ent->d_name),self_regex)){
                cout << "matches regex" << ent->d_name << endl;
            }
            else{
                cout << "does not match regex " << ent->d_name << endl;
            }
        }
        closedir(dir);
    }
    return 0;
}

输出:

matches regex.
matches regex..
matches regex.DS_Store
matches regex.gitignore
does not match regex __init__.py
does not match regex __init__.pyc
does not match regex build
does not match regex captioning_solver.py
does not match regex captioning_solver.pyc
does not match regex classifiers
does not match regex coco_utils.py
does not match regex coco_utils.pyc
does not match regex data_utils.py
does not match regex datasets
does not match regex fast_layers.py
does not match regex fast_layers.pyc
does not match regex gradient_check.py
does not match regex gradient_check.pyc
does not match regex im2col.py
does not match regex im2col.pyc
does not match regex im2col_cython.c
does not match regex im2col_cython.pyx
does not match regex im2col_cython.so
does not match regex image_utils.py
does not match regex image_utils.pyc
does not match regex layer_utils.py
does not match regex layers.py
does not match regex layers.pyc
does not match regex optim.py
does not match regex optim.pyc
does not match regex rnn_layers.py
does not match regex rnn_layers.pyc
does not match regex setup.py

2 个答案:

答案 0 :(得分:9)

当您在代码中写入字符串文字时:

"^\\\."  

您的编译器将根据C ++规则对其进行解析,以生成将在您的可执行文件中使用的字符串。例如,如果遇到\n,则可执行文件中的字符串将包含换行符。 "\\"转换为"\",但您的编译器不知道如何处理"\.",因为在C ++中定义了no such escape sequence

  

转义反斜杠后面的字符的序列   未列出(...)是有条件支持的   实现定义的语义。

所以你要找的字符串只有两个斜杠:

"^\\."

将由编译器转换为:

"^\."  

这是regex you're looking for

备注:例如,GCC会将未知的转义序列"\."转换为".",这样2或3个bakslashes实际上会产生相同的结果。

Online demo

答案 1 :(得分:2)

编译器生成警告,因为并非每个转义序列在C ++中都有意义。 可以找到有效转义序列列表here

然而,正则表达式希望你逃脱'。'为了字面上匹配'。'角色而不是任何东西。逃离 '。'在正则表达式模式中,您必须在其前面添加一个“\”字符。但是因为单个'\'表示c ++中的转义,所以需要放两个反斜杠:“\\”。因此,正确的模式是“^ \\。”。