我想使用正则表达式识别文本文件中的某些行,但是regex_match与任何行都不匹配,即使我使用正则表达式patron(“。*”)
string dirin = "/home/user/in.srt";
string dirout = "/home/user/out.srt";
ifstream in(dirin.c_str());
ofstream out(dirout.c_str());
string line;
// regex patron("(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})\\s-->\\s(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})");
regex patron(".*");
smatch m;
while (getline(in, line)) {
if (regex_match(line, m, patron)) {
out << "ok";
};
out << line;
}
in.close();
out.close();
代码总是在out.srt文件中打印字符串行,但if中没有字符串“ok”(regex_match(line,m,patron))。 我正在用以下几行测试它
1
00:01:00,708 - &gt; 00:01:01800
你看那条河
2
00:01:02,977 - &gt; 00:01:04706
轻轻地流过。
3
00:01:06,213 - &gt; 00:01:08238
你注意到了叶子
答案 0 :(得分:1)
请注意,getline()
读取带有尾随回车符 CR符号的行,并注意ECMAScript .
模式与CR符号不匹配,因为它是行尾符号
regex_match
要求整个字符串与模式匹配。
因此,您需要在模式的末尾考虑可选的回车。您可以通过在模式的末尾附加\r?
或\s*
来执行此操作:
regex patron("(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})\\s-->\\s(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})\\s*");
或
regex patron(".*\\s*");
另外,如果您的C ++版本允许,请考虑使用原始字符串文字:
regex patron(R"((\d{2}):(\d{2}):(\d{2}),(\d{3})\s-->\s(\d{2}):(\d{2}):(\d{2}),(\d{3})\s*)");