Regex_match在文件中不匹配

时间:2016-08-13 18:22:29

标签: regex c++11

我想使用正则表达式识别文本文件中的某些行,但是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

你注意到了叶子

1 个答案:

答案 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*)");