我第一次尝试在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
答案 0 :(得分:9)
当您在代码中写入字符串文字时:
"^\\\."
您的编译器将根据C ++规则对其进行解析,以生成将在您的可执行文件中使用的字符串。例如,如果遇到\n
,则可执行文件中的字符串将包含换行符。 "\\"
转换为"\"
,但您的编译器不知道如何处理"\."
,因为在C ++中定义了no such escape sequence。
转义反斜杠后面的字符的序列 未列出(...)是有条件支持的 实现定义的语义。
所以你要找的字符串只有两个斜杠:
"^\\."
将由编译器转换为:
"^\."
备注:例如,GCC会将未知的转义序列"\."
转换为"."
,这样2或3个bakslashes实际上会产生相同的结果。
答案 1 :(得分:2)
编译器生成警告,因为并非每个转义序列在C ++中都有意义。 可以找到有效转义序列列表here。
然而,正则表达式希望你逃脱'。'为了字面上匹配'。'角色而不是任何东西。逃离 '。'在正则表达式模式中,您必须在其前面添加一个“\”字符。但是因为单个'\'表示c ++中的转义,所以需要放两个反斜杠:“\\”。因此,正确的模式是“^ \\。”。